2011-12-14 4 views
6

У меня есть некоторые вещи, как этотLINQ к Entities не распознает исключение метода

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 к Entities не распознает метод «Boolean ContainsKey (System.String) ', и этот метод не может быть переведен в выражение хранилища.

+0

Возможный дубликат [linq to entity framework: использовать словарь в запросе] (http://stackoverflow.com/questions/7638859/linq-to-entity-framework-use-dictionary-in-query) – jrummell

+0

@jrummell: Это не дубликат вопроса, на который вы ссылаетесь, потому что он использует словари по-другому. – Gabe

ответ

8

Для того, чтобы перевести ваше выражение в запрос к базе данных, база данных будет каким-то образом должны знать содержание вашего словаря и есть путь доступа к нему из запроса. В 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).

+0

Привет, спасибо за быстрый повтор, но теперь получаю это исключение LINQ to Entities не распознает метод 'System.Collections.Generic.List'1 [System.String] ToList [String] (System.Collections.Generic.IEnumerable '1 [System.String]) ', и этот метод не может быть переведен в выражение хранилища. –

+0

Извините, но я должен был привести составление списка в отдельный отчет. Вы можете видеть из моего отредактированного ответа, как это сделать сейчас. – Gabe

+0

Спасибо, что решила мою проблему. –

3

Вам не разрешено использовать словарь в предложении WHERE, чтобы ограничить набор результатов, поскольку LINQ To Entities попытается превратить это в SQL и, к сожалению, он не знает, как обращаться с коллекцией Dictionary.

Смотрите эту ссылку: linq to entity framework: use dictionary in query

Смежные вопросы