query listas all c# linq entity-framework linq-to-entities where-clause

listas - select linq c# list



Dinámica donde la cláusula(OR) en Linq para Entidades (2)

En la publicación here aprendí cómo construir una consulta dinámica utilizando la ejecución diferida de Linq. Pero la consulta en realidad está utilizando una concatenación AND de la condición WHERE.

¿Cómo puedo lograr la misma consulta pero con una lógica OR?

Debido a la enumeración de indicadores, la consulta debe buscar el nombre de usuario , el nombre de usuario de Windows o ambos :

public User GetUser(IdentifierType type, string identifier) { using (var context = contextFactory.Invoke()) { var query = from u in context.Users select u; if (type.HasFlag(IdentifierType.Username)) query = query.Where(u => u.Username == identifier); if (type.HasFlag(IdentifierType.Windows)) query = query.Where(u => u.WindowsUsername == identifier); return query.FirstOrDefault(); } }


Con LINQKit''s puedes construir predicados dinámicamente .

var query = from u in context.Users select u; var pred = Predicate.False<User>(); if (type.HasFlag(IdentifierType.Username)) pred = pred.Or(u => u.Username == identifier); if (type.HasFlag(IdentifierType.Windows)) pred = pred.Or((u => u.WindowsUsername == identifier); return query.Where(pred.Expand()).FirstOrDefault(); // or return query.AsExpandable().Where(pred).FirstOrDefault();

Esto es para lo que es Expand :

El proceso de procesamiento de consultas de Entity Framework no puede manejar expresiones de invocación, por lo que debe llamar a AsExpandable en el primer objeto de la consulta. Al llamar a AsExpandable, activa la clase de visitante de expresión de LINQKit que sustituye las expresiones de invocación con construcciones más simples que Entity Framework puede entender.

O: sin ella, una expresión es Invoke d, lo que provoca una excepción en EF:

El tipo de nodo de expresión LINQ ''Invocar'' no se admite en LINQ para Entidades.

Posterior adición:

Hay un generador de predicado alternativo que hace lo mismo pero sin Expandir: http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/


Esto debería ayudar ..

Contiene consulta en múltiples columnas

También parece que hay un problema fundamental en el diseño de la tabla (corríjame si me equivoco). ¿Cuál es el propósito del IdentifierType en su base de datos?