Không thể dịch phương thức thành biểu thức cửa hàng


89

Tôi thấy mã này hoạt động với LINQ to SQL nhưng khi tôi sử dụng Entity Framework, nó phát ra lỗi này:

Phương thức LINQ to Entities không nhận dạng được phương thức 'System.Linq.IQueryable'1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures ()' và phương thức này không thể được dịch thành một biểu thức lưu trữ. '

Mã kho lưu trữ là:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates
           let AllCommFeat = GetCommunityFeatures()
           let AllHomeFeat = GetHomeFeatures()
           select new Models.Estate
                      {
                                EstateId = e.EstateId,
                                AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
                                AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
                      };
}

public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
    return from f in entity.CommunityFeatures
           select new CommunityFeatures
                      {
                          Name = f.CommunityFeature1,
                          CommunityFeatureId = f.CommunityFeatureId
                      };
}

public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
    return from f in entity.HomeFeatures
           select new HomeFeatures()
           {
               Name = f.HomeFeature1,
               HomeFeatureId = f.HomeFeatureId
           };
}

LazyList là một Danh sách mở rộng sức mạnh của IQueryable.

Ai đó có thể giải thích tại sao lỗi này xảy ra?

Câu trả lời:


115

Lý do: Theo thiết kế, LINQ thành Thực thể yêu cầu toàn bộ biểu thức truy vấn LINQ phải được dịch sang truy vấn máy chủ. Chỉ một số biểu thức con không liên quan (biểu thức trong truy vấn không phụ thuộc vào kết quả từ máy chủ) được đánh giá trên máy khách trước khi truy vấn được dịch. Không hỗ trợ các lệnh gọi phương thức tùy ý không có bản dịch đã biết, như GetHomeFeatures () trong trường hợp này.
Cụ thể hơn, LINQ to Entities chỉ hỗ trợ các hàm khởi tạokhởi tạo không tham số . Giải pháp: Do đó, để vượt qua ngoại lệ này, bạn cần hợp nhất truy vấn phụ của mình vào truy vấn chính cho GetCommunityFeatures ()GetHomeFeatures ()

thay vì gọi trực tiếp các phương thức từ bên trong truy vấn LINQ. Ngoài ra, có một vấn đề trên các dòng mà bạn đang cố gắng khởi tạo một phiên bản mới của LazyList bằng cách sử dụng các hàm tạo tham số của nó, giống như bạn có thể đã làm trong LINQ to SQL . Vì vậy, giải pháp sẽ là chuyển sang đánh giá của khách hàng đối với các truy vấn LINQ (LINQ to Objects). Điều này sẽ yêu cầu bạn gọi phương thức AsEnumerable cho các truy vấn LINQ tới Thực thể của bạn trước khi gọi phương thức khởi tạo LazyList.

Một cái gì đó như thế này sẽ hoạt động:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates.AsEnumerable()
       let AllCommFeat = from f in entity.CommunityFeatures
                         select new CommunityFeatures {
                             Name = f.CommunityFeature1,
                             CommunityFeatureId = f.CommunityFeatureId
                         },
       let AllHomeFeat = from f in entity.HomeFeatures
                         select new HomeFeatures() {
                             Name = f.HomeFeature1,
                             HomeFeatureId = f.HomeFeatureId
                         },
       select new Models.Estate {
            EstateId = e.EstateId,
            AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
            AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
       };
}


Thông tin thêm: Vui lòng xem LINQ cho các thực thể, những gì không được hỗ trợ? để biết thêm thông tin. Ngoài ra, hãy xem LINQ cho Thực thể, Cách giải quyết về những gì không được hỗ trợ để thảo luận chi tiết về các giải pháp khả thi. (Cả hai liên kết đều là phiên bản được lưu trong bộ nhớ cache vì trang web gốc bị lỗi)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.