2013-03-18 28 views
5

Một dự án chỉ chuyển từ LINQ-to-SQL để LINQ-to-đối tượng, và bây giờ tôi nhận được lỗiLoại nút biểu thức LINQ 'ArrayIndex' không được hỗ trợ trong LINQ to Entities. nhưng được hỗ trợ bởi LINQ-to-sql

The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities. 

cho dòng này:

var a = db.Table.Single(d => d.Date == dates[0]); 

(Sửa chữa nó trong trường hợp đặc biệt này rất dễ dàng, như trong

var firstDate = dates[0]; 
var a = db.Table.Single(d => d.Date == firstDate); 

)

Nhưng tại sao điều này làm việc trong LINQ-to-sql nhưng không phải trong LINQ-to-thực thể? Chúng có làm cho các đối tượng LINQ-to-entity tồi tệ hơn linq-to-sql không? Tôi đang thiếu gì?

+2

LINQ to SQL và LINQ to Các thực thể được phát triển hoàn toàn riêng biệt, không có mã chia sẻ có liên quan ở đây. Nó yêu cầu hỗ trợ thêm trong LINQ to SQL cho cái gì đó ở cái nhìn đầu tiên không có ý nghĩa (có vẻ như bạn đang cố gắng truyền 'ngày' như một tham số mảng, và có máy chủ đọc phần tử đầu tiên), vì vậy tôi ' m đoán nó không phải là rất thường được sử dụng và vì lý do đó chỉ đơn giản là không bao giờ được coi là cho LINQ to Entities. Vì đây là một dự đoán, tôi sẽ không đăng nó như một câu trả lời. – hvd

+0

Dường như một lỗi đối với tôi. Cây biểu thức nên được giải quyết thành các biểu thức đơn giản trước tiên, trước khi dịch sang SQL. Về cơ bản đây là những gì @dontomaso đang thực hiện trước ngày đánh giá [0], nhưng không cần phải làm điều đó theo cách thủ công (đặc biệt là đối với một biểu thức đơn giản như vậy). – Ackroydd

Trả lời

2

Đó là vì L2E chỉ cố dịch truy vấn của bạn sang lệnh sql. Vì vậy, mọi thứ bổ sung (các phương thức như .ToString() và những thứ khác không thể dịch sang SQL) đều dẫn đến ngoại lệ đó.

Tuy nhiên, L2S giống như LINQ đối với các đối tượng triển khai IEnumerable. Vì vậy, mục tiêu của chúng là khác nhau: L2E để dịch các truy vấn LINQ thành các lệnh sql, L2O để làm việc với các đối tượng IEnumerable trong bộ nhớ, và L2S để mô hình hóa và làm việc với một cơ sở dữ liệu.

Bây giờ, nếu muốn có thể sử dụng L2S ​​của bạn truy vấn trong dự án EF của bạn (sử dụng L2E), bạn nên đầu tiên chuyển đổi dữ liệu của bạn lấy từ bạn DbContext để IEnumerable:

var a = db.Table.AsEnumerable().Single(d => d.Date == dates[0]); 
// or any other methods... 
+2

Mang tất cả dữ liệu từ cơ sở dữ liệu đến bộ nhớ không phải là ý tưởng. Cách thích hợp là sao chép giá trị vào một biến. 'var date = date [0]; var a = db.Table.Single (d => d.Date == ngày); ' –

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