2012-01-05 19 views
22

bất kỳ ai cũng có thể giúp tôi giải quyết vấn đề của mình. Tôi đang sử dụng mã đưa ra dưới đây:Loại nút biểu thức LINQ 'Gọi' không được hỗ trợ trong LINQ to Entities trong khung thực thể

public IEnumerable<InvoiceHeader> Getdata(Expression<Func<InvoiceHeader, bool>> predicate) 
{ 
    return AccountsContext.InvoiceHeaders.Include("Company").Include("Currency") 
     .Include("BusinessPartnerRoleList").Include("DocumentType") 
     .Where(predicate); 
} 

.....

Trong mã của tôi Tôi đang sử dụng như sau

Expression<Func<InvoiceHeader, bool>> predicate = PredicateBuilder.True<InvoiceHeader>(); 
predicate = predicate.And(o => o.CompanyId == oInvoiceHeader.CompanyId); 
List<InvoiceHeader> lstInvheader=Getdata(predicate).ToList(); 

Bằng cách này tôi nhận được ngoại lệ. [System.NotSupportedException] --- {"Loại nút biểu thức LINQ 'Gọi' không được hỗ trợ trong LINQ to Entities."}

+0

Bạn đề cập đến một ngoại lệ. Tôi nghĩ bạn quên thêm nó. – THelper

+0

Nếu tôi nhớ chính xác, điều này là do làm thế nào PredicateBuilder bạn có thể lấy từ các công trình internet. Hãy thử với phiên bản này: https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/PredicateBuilder.cs –

Trả lời

1

LINQ đối với truy vấn EF được dịch sang SQL. ngoại lệ đó có nghĩa là thời gian chạy không thể dịch mã của bạn thành truy vấn SQL bởi vì nó không được hỗ trợ trong SQL.

bạn có thể thay đổi mã để bỏ qua các phần mà SQL không hỗ trợ hoặc bạn có thể lấy dữ liệu từ Cơ sở dữ liệu trước bằng cách gọi .AsEnumerable() như dưới đây, sau đó bạn có thể làm mọi thứ vì nó là LINQ-to- Đối tượng

public IEnumerable<InvoiceHeader> Getdata(Expression<Func<InvoiceHeader, bool>> predicate) 
{ 
    return AccountsContext.InvoiceHeaders.Include("Company").Include("Currency") 
     .Include("BusinessPartnerRoleList").Include("DocumentType") 
     .AsEnumerable() 
     .Where(predicate); 
} 
+0

Nhưng bằng cách này tôi nhận được thông báo lỗi sau 'System.Collections .Generic.IEnumerable 'không chứa định nghĩa cho' Where 'và phương thức mở rộng tốt nhất overload' System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable , System. Func ) 'có một số đối số không hợp lệ –

+8

Thực hiện một vị trí sau .AsEnumerable() có nghĩa là TẤT CẢ các bản ghi sẽ bị hút. Sử dụng lời khuyên này với EXTREME CAUTION. – mayu

-1

Hãy thử điều này:

var companyId = oInvoiceHeader.CompanyId; 
predicate = predicate.And(o => o.CompanyId == companyId); 
+2

Tính năng này có phù hợp với bạn hay chỉ là đoán mà không thử bất cứ thứ gì? –

48

vấn đề này có thể được giải quyết bằng cách sử dụng phương pháp AsExpandable() hiện diện trong LINQKIT bởi Joe Albahari. Anh ấy là cùng một người sáng tạo của PredicateBuilder mà tôi thấy bạn đang sử dụng.

Nếu truy vấn với Entity Framework, thay đổi dòng cuối cùng như sau:

return objectContext.Products.AsExpandable().Where(predicate);

Bạn có thể lấy LINQKIT DLL here hoặc cài đặt nó thông qua một gói NuGet here.

Nó chắc chắn sẽ giải quyết vấn đề của bạn vì nó đã giải quyết được vấn đề của tôi.