2013-09-13 29 views
15

Tôi muốn chạy mã đơn giản LINQ này để có con số kỷ lục trong LINQ nhưng kết quả là dưới lỗiLINQ to Entities không nhận ra phương pháp 'System.Linq.IQueryable`

var model = _db2.Persons.Select(
    (x, index) => new 
    { 
     rn = index + 1, 
     col1 = x.Id 
    }).ToList(); 

Lỗi:

LINQ to Entities does not recognize the method 'System.Linq.IQueryable 1[<>f__AnonymousType2 2 [System.Int32,System.Int32]] Select[Person,<>f__AnonymousType2 2](System.Linq.IQueryable 1 [MvcApplication27.Models.Person], System.Linq.Expressions.Expression 1[System.Func 3 [MvcApplication27.Models.Person,System.Int32,<>f__AnonymousType2`2 [System.Int32,System.Int32]]])' method, and this method cannot be translated into a store expression.

+0

có vẻ như 'Người không phải là 'IQueryable', hãy thử sử dụng' Cast' hoặc 'OfType' (tất nhiên nếu chúng có mặt) trước tiên. –

+0

Không, điều này là do chỉ mục để tìm số bản ghi. Đây là mã đầu tiên và tôi không có vấn đề gì khi tôi xóa chỉ mục trong lambda! – ehsan

+0

Lưu ý tiêu đề 'System.Linq.IQueryable' là kiểu trả về chứ không phải tên phương thức. Những thứ bạn nhìn thấy trong dấu ngoặc vuông ('[<> f__AnonymousType22 [System.Int32, System.Int32]]') là những thứ có trong '>' nếu bạn gõ nó ra . Hàm thực tế là sau phần đó 'Chọn [Person, <> f_AnonymousType22] (...)'. –

Trả lời

1

bạn chỉ có thể chọn Id và sau khi nó tạo ra đối tượng ẩn danh của riêng bạn sử dụng LINQ để các đối tượng, cho mẫu:

var model = _db2.Persons.Select(x => x.Id) 
         .ToList() // return int[] 
         .Select((id, index) => new 
           { 
            rn = index + 1, 
            col1 = id 
           }) // return anonymous[] (with rn and col1) 
         .AsEnumerable(); // get an IEnumerable (readonly collection) 

Problably điều này xảy ra vì Entity Framework không hỗ trợ kiểu truy vấn này bằng linq như linq có thể làm trong bộ nhớ, vì vậy, trong trường hợp này, bạn có thể chọn chỉ cần (id trong trường hợp của bạn) và thực hiện nó bằng phương pháp ToList() cụ thể hoá truy vấn của bạn và sau đó bạn sẽ có một danh sách trên bộ nhớ, vì vậy, bạn có thể sử dụng LINQ cho các đối tượng và sử dụng phương thức được hỗ trợ như bạn muốn.

+1

Bạn có thể 'AsEnumerable() 'ở giữa. Bạn sẽ có ít hơn một List() ' – xanatos

+2

Nó sẽ là tốt đẹp nếu bạn giải thích * tại sao * bạn cần phải làm điều đó. (Tôi đã cố gắng đăng câu trả lời của riêng mình nói điều gì đó tương tự nhưng tôi đã gác máy về cách giải thích tại sao điều này xảy ra với người mới tham gia EF) –

19

Vấn đề là LINQ to Entities không hiểu cách chuyển đổi quá tải Select đó (quá trình cung cấp cho bạn chỉ mục) vào truy vấn SQL. Bạn có thể sửa lỗi này bằng cách đầu tiên chọn phần từ DB bạn cần (để tránh chọn từng cột một cách không cần thiết), sau đó thực hiện AsEnumerable() để lấy nó làm IEnumerable<T> thay vì IQueryable<T>, và sau đó thực hiện Select hoàn toàn bằng C# (trong ngắn hạn, IQueryable<T> s được chuyển đổi sang SQL, trong khi IEnumerable<T> s được chạy trong mã).

var model = _db2.Persons.Select(x => x.Id).AsEnumerable().Select(
    (id, index) => new 
    { 
     rn = index + 1, 
     col1 = id 
    }).ToList(); 

Lưu ý rằng truy vấn như bạn thấy dường như không có thứ tự, vì vậy cặp id/index có thể thay đổi mỗi lần bạn gọi. Nếu bạn mong đợi tính nhất quán, bạn nên đặt hàng bằng một thứ gì đó (ví dụ: _db2.Persons.OrderBy(...)).

+4

Như một tài liệu tham khảo hay [đây là danh sách] (http: // msdn .microsoft.com/en-us/library/bb738550.aspx) của tất cả các câu lệnh Linq được xây dựng trong khung công tác và danh sách nếu nó tương thích hay không. –

+0

Bạn không nghĩ rằng 2 lựa chọn (select(). AsEnumerable(). Select()) làm giảm hiệu quả so sánh với đơn giản bằng 1 câu lệnh SQL? – ehsan

+0

@ehsan có, nhưng bạn không thể sử dụng chức năng 'Select (...)' với khung Entity. Bạn sẽ cần phải sử dụng [Cú pháp truy vấn] (http://msdn.microsoft.com/en-us/library/bb397676.aspx) với ['let'] (http://msdn.microsoft.com/vi -us/library/bb383976.aspx) hoặc sử dụng một cú pháp phương pháp phức tạp hơn so với những gì bạn có (mà tôi nghĩ rằng sẽ làm giảm đáng kể khả năng đọc) –

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