問題
EF4 +SQLCE4を使用してintを文字列に変換する必要があります。SqlFunctions.StringConvert(double)を使用する推奨オプションでも、エラーが発生します。
オプション1(オリジナル)。これは私にエラーを与えます:
public static IEnumerable<SelectListItem> xxGetCustomerList()
{
using (DatabaseEntities db = new DatabaseEntities())
{
var list = from l in db.Customers
orderby l.CompanyName
select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName };
return list.ToList();
}
}
オプション2(最も推奨)。次に、多くの投稿が示唆しているように、ライブラリSystem.Data.Objects.SqlClientのSqlFunctions.StringConvert()関数を使用しました。
public static IEnumerable<SelectListItem> GetCustomerList()
{
using (DatabaseEntities db = new DatabaseEntities())
{
var list = from l in db.Customers
orderby l.CompanyName
select new SelectListItem { Value = SqlFunctions.StringConvert((double)l.CustomerID), Text = l.CompanyName };
return list.ToList();
}
}
これで、以下のエラーが表示されます。
The specified method 'System.String StringConvert(System.Nullable`1[System.Double])' on the type 'System.Data.Objects.SqlClient.SqlFunctions' cannot be translated into a LINQ to Entities store expression.
オプション3(非常に特殊な場合)。次に、アノテーターの投稿は、辞書を使用したスマートなソリューションを示しています。これは最終的に機能します。
public static IEnumerable<SelectListItem> xGetCustomerList()
{
using (DatabaseEntities db = new DatabaseEntities())
{
var customers = db.Customers.ToDictionary(k => k.CustomerID, k => k.CompanyName);
var list = from l in customers
orderby l.Value
select new SelectListItem { Value = l.Key.ToString(), Text = l.Value };
return list.ToList();
}
}
ただし、単純なペア値(キー、値)に対してのみ機能します。誰かが別の解決策やオプション2で私が間違っていることを手伝ってくれますか?
そして、MicrosoftがすぐにEFを作成してから、すでに安定していてはるかに成熟しているL2Sからの移行を推進することを願っています。SQL CEを使用したいという理由だけで、実際にEF4を使用しています。それ以外の場合は、L2Sを使用します。