2009-09-18 8 views
7

cómo iba a escribir algo como esto en LINQ a las entidadesLINQ Si Declaración

sb.Append(" WHERE question.question_isdeleted = 0"); 
    if (catid != 0) 
     sb.AppendFormat(" AND (CatID IN ({0}))", catsSTR); 
    if(!string.IsNullOrEmpty(AuthorID)) 
     sb.Append(" AND (question_ownerid = @id)"); 

Creo que sólo necesito la sintaxis para escribir un si condicional en LINQ a las entidades

Respuesta

14

me gustaría utilizar la notación de puntos aquí:

var query = questions.Where(q => !q.IsDeleted); 

if (catId != 0) 
{ 
    query = query.Where(q => cats.Contains(q.CatID)); 
} 
if (authorId != 0) 
{ 
    query = query.Where(q => q.OwnerId == authorId); 
} 

Se puede escribir su propio método de extensión para hacer esto un poco más simple:

public static IQueryable<T> OptionalWhere<T>(
    this IQueryable<T> source, 
    bool condition, 
    Expression<Func<T,bool>> predicate) 
{ 
    return condition ? source.Where(predicate) : source; 
} 

A continuación, podría escribir:

var query = questions.Where(q => !q.IsDeleted); 
        .OptionalWhere(catId != 0, q => cats.Contains(q.CatID)) 
        .OptionalWhere(authorId != 0, q => q.OwnerId == authorId); 
+0

Jon, me encanta el método de extensión OptionalWhere. Totalmente increíble :)/me roba el nugget de platino ... –

+0

hey, ese es un código increíble ... bueno – user161433

-1
where question.question_isdeleted = 0 
    && (catid != 0 
    ? catsStr.Contains(CatId.ToString()) 
    : question_ownerId == id) 

No estoy seguro si las operaciones de cadena son correctas, pero la lógica parece correcta.

+0

que causaría LINQ a Entidades para tratar de traducir toda la declaración de SQL, lo cual no tendría sentido si 'catid' es desconocido en la base de datos. Un problema adicional con esta respuesta es que agregaría una cláusula where * cualquiera * en 'catsStr' * o *' question_ownerId'. Eso no es lo que se pidió. –

+1

Las variables en LINQ to Entities se convierten en parámetros en SQL, por lo que es legal usar catId aquí. –

0

Usted puede construir condicionalmente una consulta como esta:

var query = from q in questions 
      where q.question_isdeleted 
      select q; 
if(!string.IsNullOrEmpty(AuthorID)) 
{ 
    query = from q in query 
      where q.question_ownerid == AuthorID 
      select q; 
} 

Sin embargo, LINQ a Entidades no tienen buena construcción que se asemeja a la de SQL en el operador ...

Cuestiones relacionadas