エンティティにLINQの中で文字列にint型に変換する通報
-
21-08-2019 - |
質問
var items = from c in contacts
select new ListItem
{
Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
Text = c.Name
};
var items = from c in contacts
select new ListItem
{
Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
Text = c.Name
};
私はこれを達成することができますとにかくありますか? 注、VB.NETであることを何ら問題はそれだけで素晴らしい作品最初のスニペットを使用しないで、VBは柔軟性があり、できないイムは、C#の厳しさに慣れる!!!
解決
EFのV4を使用すると、 SqlFunctions.StringConvert
に使用することができます。あなたは、ダブルまたは小数にキャストする必要があるので、int型のための過負荷はありません。あなたのコードは次のように見てしまいます:
var items = from c in contacts
select new ListItem
{
Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
Text = c.Name
};
他のヒント
私は、クエリのうち、文字列に整数の変換を配置することによって、同様の問題を解決しました。これは、オブジェクトにクエリを置くことによって達成することができます。
var items = from c in contacts
select new
{
Value = c.ContactId,
Text = c.Name
};
var itemList = new SelectList();
foreach (var item in items)
{
itemList.Add(new SelectListItem{ Value = item.ContactId, Text = item.Name });
}
利用LinqToObject:連絡先の AsEnumerable()の
。var items = from c in contacts.AsEnumerable()
select new ListItem
{
Value = c.ContactId.ToString(),
Text = c.Name
};
SqlFunctions.StringConvertは動作しますが、私はそれが面倒見つけて、ほとんどの時間は、私はSQL側で文字列変換を実行するための本当の必要性を持っていません。
私は文字列操作を行いたい場合は、私がやっていることは、その後、LINQツーオブジェクトに刺さを操作し、LINQツーエンティティ最初にクエリを実行です。この例では、私は連絡先のフルネームを含むデータのセット、および2つの整数の列(ContactIDとLocationID)の文字列の連結のあるContactLocationKeyを取得したい。
// perform the linq-to-entities query, query execution is triggered by ToArray()
var data =
(from c in Context.Contacts
select new {
c.ContactID,
c.FullName,
c.LocationID
}).ToArray();
// at this point, the database has been called and we are working in
// linq-to-objects where ToString() is supported
// Key2 is an extra example that wouldn't work in linq-to-entities
var data2 =
(from c in data
select new {
c.FullName,
ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(),
Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString())
}).ToArray();
さて、私はそれが2つの匿名の選択を記述する必要がありますが面倒取得ん付与が、私はそれはあなたがL2Eでサポートされていない文字列(およびその他)の機能を実行することができたの利便性を上回るされて主張するだろう。また、おそらくこの方法を使用してパフォーマンスのペナルティがあることに留意してください。
public static IEnumerable<SelectListItem> GetCustomerList()
{
using (SiteDataContext db = new SiteDataContext())
{
var list = from l in db.Customers.AsEnumerable()
orderby l.CompanyName
select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName };
return list.ToList();
}
}
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
Text = a.ClassName,
Value = a.ClassId.ToString()
});
まず、その後のtoString()は正しいであろうオブジェクトに変換します。
ブライアンCauthonの答えは素晴らしいです!ほんの少しのアップデートは、EF 6のために、クラスは別の名前空間に移動しました。だから、EF 6の前に、あなたが含まれている必要があります:
System.Data.Objects.SqlClient
あなたはEF 6にアップデート、または単にこのバージョンを使用している場合は、含まれます:
System.Data.Entity.SqlServer
EF6と間違った名前空間を含めることにより、コードがうまくコンパイルされますが、ランタイムエラーがスローされます。私はこのノートにはいくつかの混乱を避けるために役立ちます願っています。
私はこの同じ問題に遭遇した...
IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
"ID", "Name", model.ProducerID);
GetProducers()は、単に生産のエンティティのコレクションを返します。 後記SqlFunctions.StringConvertは私のために動作しませんでした。
、私は次のコードはうまく機能を願っています。
var items = contact.Distinct().OrderBy(c => c.Name)
.Select( c => new ListItem
{
Value = c.ContactId.ToString(),
Text = c.Name
});
感謝します。
MySQLを使用して、SqlFunctions.StringConvert
が私のために動作しませんでした。私は私のプロジェクトで20+場所でSelectListItem
を使用しているので、私は20+ LINQ文をcontortingなしで動作するソリューションを求めていました。私の解決策は、LINQから離れる型変換を移動整数セッターを提供するために、サブクラスSelectedListItem
でした。明らかに、このソリューションは一般化することは困難ですが、私の特定のプロジェクトのために非常に役に立ちました。
、使用SelectedListItem
の代わりに、あなたのLINQクエリで、次の種類と使用を作成し、値の代わりにIntValueを使用します。
public class BtoSelectedListItem : SelectListItem
{
public int IntValue
{
get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); }
set { Value = value.ToString(); }
}
}
もう一つの解決策ます:
c.ContactId + ""
ただ、空の文字列を追加し、それを文字列に変換されます。
唯一のint許容その後、あなたはこれを試すことができますLINQクエリでこれを使用することができます。
var items = from c in contacts
select new ListItem
{
Value = (int)ContractId
Text = c.Name
};
の文字列をintに、あなたが望む結果を得るために、あなたがどんな変換を必要としないので、(int)を使用すると、int型にあなたの価値をキャストしますので、それが動作します。
これは私のプロジェクトで私のために働いていた私は、それはあなたのために参考になると思います。
私の理解では、あなたのモデルを「拡張」とクラスのプロパティの残りの部分を利用することができます読み取り専用であるプロパティを追加する部分クラスを作成する必要があるということです。
public partial class Contact{
public string ContactIdString
{
get{
return this.ContactId.ToString();
}
}
}
そして、
var items = from c in contacts
select new ListItem
{
Value = c.ContactIdString,
Text = c.Name
};
var items = from c in contacts
select new ListItem
{
Value = String.Concat(c.ContactId), //This Works in Linq to Entity!
Text = c.Name
};
私はSqlFunctions.StringConvert((double)c.Age)
は、いずれかのフィールドの型がNullable<Int32>
のです。
私はこれを見つけるために試行錯誤の最後の数日間での検索の多くを取っています。
私は、これはそこにいくつかのプログラマーに役立ちます願っています。
あなたは試すことができます:
var items = from c in contacts
select new ListItem
{
Value = Convert.ToString(c.ContactId),
Text = c.Name
};