2009-09-18 9 views
7

jak bym napisać coś takiego w LINQ do podmiotówLINQ Jeśli komunikat

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

Chyba wystarczy składnię napisać jeśli warunkowa w LINQ do podmiotów

Odpowiedz

14

chciałbym użyć notacji dot tutaj:

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

można napisać własną metodę rozszerzenia to zrobić nieco prościej:

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

Można wtedy napisać:

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

Jon, uwielbiam metodę rozszerzenia OptionalWhere. Totally awesome :)/me kradnie ten platynowy samorodek ... –

+0

hej to świetny kod ... fajny – user161433

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

nie wiem, czy operacje na ciągach są poprawne, ale logika wygląda poprawnie.

+0

To spowodowałoby LINQ do podmiotów, aby spróbować przetłumaczyć całą oświadczenie SQL, które nie miałoby sensu, jeśli 'catid' jest nieznana w bazie danych. Dodatkowym problemem z tą odpowiedzią jest dodanie klauzuli where * * na 'catsStr' * lub *' question_ownerId'. Nie o to pytano. –

+1

Zmienne w LINQ do jednostek stają się paramotami w SQL, więc używanie tutaj catId jest legalne. –

0

Można warunkowo zbudować kwerendę tak:

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

Jednak LINQ do podmioty nie mają dobrą konstrukcję podobny do SQL w operatora ...

Powiązane problemy