Как написать Linq To Entities с несколькими необязательными параметрами - PullRequest
0 голосов
/ 01 июля 2018

У меня есть таблица с названием Items (Имя, Описание)

Пользователь может искать элементы на основе имени, описания или обоих. (Фактическая таблица имеет около 15 полей, по которым можно искать, но в этом примере просто оставляем два).

Это ищет как имя, так и описание. Но мне нужно, чтобы это было одно, другое или оба.

var source = this.DbContext.Items;

IQueryable<Item> items = source.Where(a => a.Name.Contains(item.Name));

items = items.Where(a => a.Description.Contains(item.Description));

return items.ToList();

Это лучшее, что я придумал, но эта вторая строка кажется довольно прикольной.

internal List<Item> Search(Item item)
{
    var source = this.DbContext.Items;
    IQueryable<Item> items = source.Where(a=> a == a);

    if(!string.IsNullOrWhiteSpace(item.Name)) items = items.Where(a => a.Name.Contains(item.Name));

    if(!string.IsNullOrWhiteSpace(item.Description)) items = items.Where(a => a.Description.Contains(item.Description));

    return items.ToList();          
}       

1 Ответ

0 голосов
/ 01 июля 2018

Если вы хотите избавиться от второй строки в этом фрагменте:

var source = this.DbContext.Items;
IQueryable<Item> items = source.Where(a=> a == a);

Просто замените их следующим:

// your Linq To Entities query is already an IQueryable<T>
var items = from item in this.DbContext.Items
            select item;

Или более просто удалите ключевое слово var:

// There is an implicit conversion between DbSet<T> and IQueryable<T> 
// but you gain from it only if you remove the var keyword and not use the type inference
IQueryable<Item> items = this.DbContext.Items;
...