5

カスタム モデルを使用した LINQ クエリが 1 つあります。メソッドを使用して、モデル プロパティに値を割り当てたかっただけです。しかし、カスタム モデルを使用しようとすると、次のようなエラー メッセージが表示されます。

LINQ to Entities はメソッド 'System.String GetPONo(Ent, System.String)' メソッドを認識せず、このメソッドはストア式に変換できません。

コード

var model = (from p in db.PoDetails
             select new porders
             {
                 Category = p.Category,
                 PONO = GetPONo(p, p.Category),
              }).ToList();

方法

public string GetPONo(PoDetail p, string ASD)
{
    if (ASD == "B")
    {
        var PoNo = (from pord in db.Porders where pord.Id == p.PoId select pord.No).FirstOrDefault();
        return PoNo;
    }
    else
    {
        var PoNo = (from porder in db.Porders
                    where porder.Id == (from rec in db.RecommendResources where rec.Id == p.BibId select rec.PoId).FirstOrDefault()
                    select porder.No).FirstOrDefault();
        return PoNo;
    }
}
4

2 に答える 2

6

これは、LINQ to Entities がバックグラウンドで SQL に変換されるためです。もちろんGetPONo(p, p.Category)、SQL にはメソッドがないため、コードは失敗します。これを解決するには、 を呼び出しToList()て、select.

var model = (from p in db.PoDetails select p).ToList();
model = from m in model
        select new porders
        {
            Category = m.Category,
            PONO = GetPONo(m, m.Category)
        };

ここで同様の質問に対する私の回答を見ることができます

于 2013-01-09T08:51:04.870 に答える
1

三項演算子を使用して、カテゴリ値に応じて PONO の異なるサブクエリを実行できます

var model = (from p in db.PoDetails
             select new porders
             {
                 Category = p.Category,
                 PONO = p.Category == "B" ?
                        (from pord in db.Porders 
                         where pord.Id == p.PoId 
                         select pord.No).FirstOrDefault() :
                        (from porder in db.Porders
                         where porder.Id == (from rec in db.RecommendResources 
                                             where rec.Id == p.BibId 
                                             select rec.PoId).FirstOrDefault()
                         select porder.No).FirstOrDefault()
             }).ToList();

また、そのためのストアド プロシージャを作成することもできます。

于 2013-01-09T08:46:14.373 に答える