LINQ to Entities无法识别方法异常

时间:2011-12-14 13:44:22

标签: asp.net-mvc linq

我有这样的事情

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);

执行Linq语句时,它会抛出异常说法 LINQ to Entities无法识别方法'Boolean ContainsKey(System.String)'方法,并且此方法无法转换为商店表达式。

3 个答案:

答案 0 :(得分:9)

为了将表达式转换为数据库查询,数据库必须以某种方式知道字典的内容,并有办法从查询中访问它。 SQL中没有字典机制,但这并不重要,因为您不需要字典,因为您只是在寻找值为某个常量的键。您可以将该组密钥转换为列表,并查看该列表是否包含您要查找的内容:

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;

我怀疑你实际上并没有将空字符串作为字典中的键,这意味着你可以摆脱IsNullOrEmpty调用并且只有where groupsList.Contains(hp.GroupName)

答案 1 :(得分:3)

不允许在WHERE子句中使用字典来限制结果集,因为LINQ To Entities会尝试将其转换为SQL,不幸的是,它不知道如何处理Dictionary集合。

请参阅此链接:linq to entity framework: use dictionary in query

答案 2 :(得分:1)

我有同样的问题。最简单的解决方案是替换方法

where groupsMap.ContainsKey(hp.GroupName) 

具有与LINQ to Entities相同功能的方法:

where groupsMap.Keys.Contains(hp.GroupName)

正如answer here所说,这两个函数的作用完全相同。