Linq If Заявление - PullRequest
       11

Linq If Заявление

7 голосов
/ 18 сентября 2009

Как мне написать что-то подобное в linq для сущностей

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

я думаю, что мне просто нужен синтаксис, чтобы написать условное выражение в linq для сущностей

Ответы [ 3 ]

14 голосов
/ 18 сентября 2009

Я бы использовал здесь обозначение точки:

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

Вы можете написать свой собственный метод расширения, чтобы сделать это немного проще:

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

Вы можете написать:

var query = questions.Where(q => !q.IsDeleted);
                     .OptionalWhere(catId != 0, q => cats.Contains(q.CatID))
                     .OptionalWhere(authorId != 0, q => q.OwnerId == authorId);
0 голосов
/ 18 сентября 2009

Вы можете условно построить запрос следующим образом:

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

Однако у LINQ to Entities нет хорошей конструкции, которая напоминает оператор SQL IN ...

0 голосов
/ 18 сентября 2009
where question.question_isdeleted = 0
  && (catid != 0 
     ? catsStr.Contains(CatId.ToString())
     : question_ownerId == id)

Не уверен, что строковые операции верны, но логика выглядит правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...