Tôi đang cố gắng viết một LINQ thành phương thức mở rộng thực thể lấy Func để chọn một Id thuộc tính và so sánh nó với một danh sách các id.Làm thế nào để sử dụng một Func trong một biểu thức với LINQ to Entity Framework?
Lớp
public class A
{
public int AId { get; set; }
}
public class B
{
public int BId { get; set; }
}
Extension Method
public static IQueryable<T> WithId<T>(this IQueryable<T> entities,
Func<T, int> selector, IList<int> ids)
{
Expression<Func<T, bool>> expression = x => ids.Contains(selector(x));
return entities.Where(expression); // error here (when evaluated)
}
Calling Phương pháp
var ids = new List<int> { 1, 2, 3 };
DbContext.EntityAs.WithId(e => e.AId, ids);
DbContext.EntityBs.WithId(e => e.BId, ids);
Vấn đề tôi trải nghiệm là nó đang cố gắng gọi hàm không được phép trong khung thực thể.
Làm cách nào để sử dụng công cụ chọn thuộc tính (Func) để đánh giá truy vấn?
Phạm vi mã bạn có thể gọi trong truy vấn EF bị giới hạn bởi thực tế nó vẫn cần được dịch trong SQL. Trong trường hợp của bạn, EF không biết cách tự động dịch một IList. –
Tôi không chắc bạn có đúng với điều đó không. DbContext.EntityAs.Where (e => ids.Contains (e.Id)) được dịch bởi EF một cách chính xác. Tôi chỉ đang cố gắng tạo một hàm có thể sử dụng lại để tôi có thể xác định thuộc tính nào cần chọn. – David
Vì EF biết cách thực hiện 'select x trong đó x in (1,2,3)' trong trường hợp liệt kê hoặc 'select x trong đó x in (select y)' trong trường hợp của một quan hệ thực thể khác. Trong trường hợp của bạn, EF sẽ cần phải biên dịch một cái gì đó như 'select x trong đó x in (chọn y trong đó F (y) trong (F (1), F (2), ...))'. Trong khi nó có thể làm điều này bằng tay EF chỉ không hỗ trợ các trường hợp * chưa * –