30

MVC3 Web アプリケーション内でエラーが発生しました。 LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

クエリから EF を使用して値をフェッチしようとすると:

public class DataRepository
    {
        public mydataEntities1 dbContext = new mydataEntities1();

        public List<SelectListItem> GetPricingSecurityID()
        {
        var pricingSecurityID = (from m in dbContext.Reporting_DailyNAV_Pricing
                                     select new SelectListItem
                                         {
                                                Text = m.PricingSecurityID.ToString(),
                                                Value = m.PricingSecurityID.ToString()
                                         });

        return pricingSecurityID.ToList();
        }
    }
4

8 に答える 8

55

これは SQL に変換できません。理論的には可能だと思いますが、実装されていません。

結果が得られたら、投影を実行するだけです。

var pricingSecurityID = (from m in dbContext.Reporting_DailyNAV_Pricing
                                     select m.PricingSecurityID).AsEnumerable()
    .Select(x => new SelectListItem{ Text = x.ToString(), Value = x.ToString() });
于 2012-04-11T16:47:26.693 に答える
18

ToStringそれがすでに文字列である場合、そもそもなぜわざわざ呼び出すのですか? 無意味なので、LINQ to Entities に翻訳が含まれていなかったのではないかと思います。select 句を次のように変更します。

select new SelectListItem
{
    Text = m.PricingSecurityID,
    Value = m.PricingSecurityID
}

LINQ to Entities でサポートされていないことを本当に行う必要がある場合AsEnumerableは、データベース クエリからインプロセスに移行するために使用します。

public List<SelectListItem> GetPricingSecurityID()
{
    return dbContext.Reporting_DailyNAV_Pricing
                    .Select(m => m.PricingSecurityID)
                    .AsEnumerable() // Rest of query is local
                    // Add calls to ToString() if you really need them...
                    .Select(id => new SelectListItem { Text = id, Value = id })
                    .ToList();
}

ところで、私もジェイソンの反対に同意します。List<string>他の場所でレンダリングされた a を返す方がよいでしょう。

また、単一の句または句のみを使用する場合クエリ式は実際にはあまり追加されないことに注意してください. tは、クエリ式 ( など) でサポートされています。selectwhereToList

于 2012-04-11T16:45:51.813 に答える
4

それを SQL に変換しようとしているのに、変換できないからです。への呼び出しを中止し、ToString呼び出し元に戻る前にプロジェクションを実行します。したがって、select句を次のように置き換えます

select m.PricingSecurityID

そして言う

return pricingSecurityID
           .AsEnumerable()
           .Select(x => x.ToString())
           .Select(x => new SelectListItem { Text = x, Value = x })
           .ToList();

また、UI の問題とデータ クエリの問題が混在していることにも注意してください。これは一般的に悪い習慣です。実際には、ID のリストを返すだけで、コードの UI 部分にそれを適切な形式に仕上げることを心配させる必要があります。

于 2012-04-11T16:42:49.270 に答える
4

これはどう。この例では、データベースの VDN フィールドと Skill フィールドの両方が整数です。両方のフィールドからの一致を探しているので、2 つの比較があります。

これを含めます:

using System.Data.Objects.SqlClient; // needed to convert numbers to strings for linq

数値を比較するときは、次のようにします。

        // Search Code
            if (!String.IsNullOrEmpty(searchString))
            {
                depts = depts.Where(d => SqlFunctions.StringConvert((double)d.VDN).Contains(searchString.ToUpper())
                || SqlFunctions.StringConvert((double)d.Skill).Contains(searchString.ToUpper()));
            }
        // End Search Code

ワーキー。

于 2012-12-13T14:28:23.437 に答える
3

悲しいことに、EF は .ToString() を変換する方法を知りません。埋め込み関数 SqlFunctions.StringConvert を使用する必要があります。 double への型キャスト :-(

var vendors = 
   from v in Vendors  
   select new
   {             
       Code = SqlFunctions.StringConvert((double)v.VendorId)
   }; 
于 2013-08-24T15:54:19.297 に答える
-3
return dbContext.Reporting_DailyNAV_Pricing.AsEnumerable().Select(x => new SelectListItem
{
    Text = x.PricingSecurityID.ToString(),
    Value = x.PricingSecurityID.ToString()
}).ToList();
于 2015-05-07T12:36:21.910 に答える