2011-12-14 19 views
6

tengo alguna cosa como estaLINQ a Entidades no reconoce el método excepción

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

Durante la ejecución de la declaración de LINQ que está lanzando una excepción diciendo LINQ a Entidades no reconoce el método 'booleana ContainsKey (System.String) 'método, y este método no se puede traducir a una expresión de tienda.

+0

posible duplicado de [linq a entity framework: use dictionary in query] (http://stackoverflow.com/questions/7638859/linq-to-entity-framework-use-dictionary-in-query) – jrummell

+0

@jrummell: Esto no es un duplicado de la pregunta a la que se enlaza porque usa diccionarios de una manera diferente. – Gabe

Respuesta

8

Con el fin de traducir su expresión en una consulta de base de datos, la base de datos de alguna manera tiene que conocer el contenido de su diccionario y tener una manera de acceder a él desde la consulta. No hay un mecanismo de diccionario en SQL, pero eso no importa porque no necesita un diccionario porque solo busca claves cuyo valor sea una cierta constante. Puede convertir ese juego de llaves en una lista y ver si esa lista contiene lo que estás buscando:

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; 

sospecho que en realidad no tiene la cadena vacía como una llave en su diccionario, aunque , lo que significa que puede deshacerse de la llamada IsNullOrEmpty y simplemente tener where groupsList.Contains(hp.GroupName).

+0

Hola, gracias por la repetición rápida, pero ahora recibo esta excepción LINQ to Entities no reconoce el método 'System.Collections.Generic.List'1 [System.String] ToList [String] (System.Collections.Generic.IEnumerable '1 [System.String]) 'método, y este método no se puede traducir a una expresión de tienda. –

+0

Lo siento, pero debería haber puesto la lista en una declaración separada. Puedes ver desde mi respuesta editada cómo hacerlo ahora. – Gabe

+0

Muchas gracias solucionó mi problema. –

3

No tiene permitido usar su diccionario en la cláusula WHERE para limitar su conjunto de resultados porque LINQ To Entities intentará convertir esto en SQL y, lamentablemente, no sabe cómo manejar la colección de diccionarios.

ver este enlace: linq to entity framework: use dictionary in query

Cuestiones relacionadas