2011-12-14 25 views
6

Tôi có một số điều như thế nàyLINQ to Entities không công nhận ngoại trừ phương pháp

SecuritySearcher sc = new SecuritySearcher(); 
Dictionary<string, bool> groupsMap = 
    sc.GetUserGroupMappings(domainName, currentUser, distGroups.ToList()); 

IQueryable<HotelTravel> groupq = 
    (from hotel in qHs 
    join hp in qHps on hotel.HotelTravelId equals hp.HotelTravelId 
    where !string.IsNullOrEmpty(hp.GroupName) 
     && groupsMap.ContainsKey(hp.GroupName) 
     && groupsMap[hp.GroupName] == true 
    select hotel); 

Trong khi thực hiện LINQ tuyên bố nó là ném ngoại lệ nói LINQ to Entities không nhận ra phương pháp 'Boolean containsKey (System.String) 'phương pháp, và phương pháp này không thể được dịch sang một biểu thức cửa hàng.

+0

bản sao có thể có của [linq vào khung pháp nhân: sử dụng từ điển trong truy vấn] (http://stackoverflow.com/questions/7638859/linq-to-entity-framework-use-dictionary-in-query) – jrummell

+0

@jrummell: Đây không phải là bản sao của câu hỏi bạn liên kết bởi vì nó sử dụng từ điển theo một cách khác. – Gabe

Trả lời

8

Để dịch biểu hiện của bạn thành một truy vấn cơ sở dữ liệu, cơ sở dữ liệu sẽ bằng cách nào đó phải biết nội dung của từ điển của bạn và có một cách để truy cập nó từ truy vấn. Không có cơ chế từ điển trong SQL, nhưng điều đó không quan trọng bởi vì bạn không cần một từ điển vì bạn chỉ tìm kiếm các khóa có giá trị là một hằng số nhất định. Bạn có thể biến bộ khóa đó thành danh sách và xem danh sách đó có chứa những gì bạn đang tìm kiếm không:

var groupsList = (from kvp in groupsMap  // find all keys in groupsMap 
        where kvp.Value == true // where the value is set to True 
        select kvp.Key).ToList(); 

IQueryable<HotelTravel> groupq = 
    from hotel in qHs 
    join hp in qHps on hotel.HotelTravelId equals hp.HotelTravelId 
    where !string.IsNullOrEmpty(hp.GroupName) 
      && groupsList.Contains(hp.GroupName) 
    select hotel; 

Tôi nghi ngờ bạn không thực sự có chuỗi trống làm khóa trong từ điển của mình , có nghĩa là bạn có thể thoát khỏi cuộc gọi IsNullOrEmpty và chỉ có where groupsList.Contains(hp.GroupName).

+0

Xin cảm ơn vì đã phát lại nhanh nhưng tôi nhận được ngoại lệ này ngay bây giờ LINQ to Entities không nhận ra phương thức 'System.Collections.Generic.List'1 [System.String] ToList [String] (System.Collections.Generic.IEnumerable Phương thức '1 [System.String]) 'và phương thức này không thể được dịch sang biểu thức cửa hàng. –

+0

Xin lỗi, nhưng tôi nên đặt danh sách thành một tuyên bố riêng biệt. Bạn có thể thấy từ câu trả lời đã chỉnh sửa của tôi cách thực hiện điều đó ngay bây giờ. – Gabe

+0

Cảm ơn rất nhiều nó đã giải quyết được vấn đề của tôi. –

3

Bạn không được phép sử dụng từ điển của bạn trong mệnh đề WHERE để giới hạn tập kết quả của bạn vì LINQ To Entities sẽ cố gắng biến nó thành SQL và không may, nó không biết cách xử lý bộ sưu tập Từ điển.

Xem liên kết này: linq to entity framework: use dictionary in query

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