2013-01-09 29 views
5

Tôi có một Truy vấn LINQ với mô hình tùy chỉnh. Tôi chỉ muốn sử dụng một phương thức để gán một giá trị cho một thuộc tính mô hình. Nhưng khi tôi cố gắng sử dụng mô hình tùy chỉnh, nó sẽ gửi một số thông báo lỗi như sau:Gọi một phương thức bên trong LINQ Query

LINQ to Entities không nhận ra phương thức 'System.String GetPONo (Ent, System.String)' và phương pháp này không thể được dịch sang biểu thức cửa hàng.

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

Phương pháp

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; 
    } 
} 

Trả lời

1

Bạn có thể sử dụng toán tử ternary làm subquery khác nhau cho PONO tùy thuộc vào giá trị loại

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

Ngoài ra, bạn có thể tạo thủ tục lưu trữ cho điều đó.

+1

Cảm ơn. Làm việc tốt. – Dheyv

6

Điều này là do LINQ to Entities được dịch sang SQL đằng sau hậu trường. Tất nhiên không có phương thức GetPONo(p, p.Category) trong SQL nên mã của bạn sẽ không thành công. Bạn có thể giải quyết vấn đề này bằng cách gọi ToList() để buộc truy vấn chạy trước select của bạn.

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

Bạn có thể có một cái nhìn vào câu trả lời của tôi đến một câu hỏi tương tự here

Các vấn đề liên quan