2013-01-09 61 views
5

我有一個LINQ查詢與自定義模型。我只是想用一種方法爲模型屬性賦值。但是,當我嘗試使用自定義模型,可以拋出一些像這樣的錯誤消息:調用LINQ查詢中的方法

LINQ到實體無法識別方法「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; 
    } 
} 

回答

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(); 

您也可以爲此創建存儲過程。

+1

感謝。它的工作正常。 – Dheyv

6

這是因爲LINQ to Entities在幕後轉換爲SQL。當然,在SQL中沒有GetPONo(p, p.Category)方法,所以你的代碼會失敗。您可以通過調用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) 
     }; 

你可以看看我的回答類似的問題here