2015-10-04 5 views
5

У меня есть .Net-функция, которая принимает 3 параметра, все необязательные. Что-то вроде этого:Linq с опциями WHERE

public List<MyObject> Search(string colour, string size, string name) 
{ 
    var result = (from c in MyTable where .... select c).ToList();  
} 

Мой вопрос, что это лучший способ сделать where часть. Лучше всего было бы создать динамический linq? Каков наилучший шаблон, в linq, чтобы иметь необязательные параметры?

Так, в SQL, что-то вроде этого:

SELECT * 
FROM MyTable 
WHERE (@colour <> '' AND colour = @colour) 
    AND (@size <> '' AND size = @size) 
    AND (@name <> '' AND name = @name) 

Но я надеюсь, там аккуратнее, более приемлемый образец для делать это в LINQ.

+0

Вы можете использовать 'библиотеки Expression's или некоторые третьей часть Dynamic Linq. –

ответ

1

Просто цепную Where пункты с проверкой на нуль

var result = context.MyTable 
        .Where(t => color == null || color == t.Color) 
        .Where(t => size == null || size == t.Size) 
        .Where(t => name == null || name == t.Name) 
        .ToList() 
0

Вы можете сделать что-то вроде следующего в вашем Search метод:

var query = from c in MyTable select c; 
if (!String.IsNullOrEmpty(colour)) 
    query = from c in query where c.colour == colour select c; 
if (!String.IsNullOrEmpty(size)) 
    query = from c in query where c.size == size select c; 
if (!String.IsNullOrEmpty(name)) 
    query = from c in query where c.name == name select c; 
return query.ToList(); 
0

Как о:

public List<MyObject> Search(string colour, string size, string name) 
{ 
    IEnumerable<MyObject> result = MyTable; 

    if(colour != null) 
     result = result.Where(o => o.Colour == colour); 

    if(size != null) 
     result = result.Where(o => o.Size == size); 

    ... 

    return result.ToList(); 
} 
2
var results = olstOfObjects.Where(x => 
    (x.size == size || x.size == "") && 
    (x.color == color || x.color == "") && 
    (x.name == name || x.name == "")).ToList(); 
3

В таких случаях, я бы посоветовал вам использовать PredicateBuilder для создания ваши запросы. Вы можете скопировать код здесь, или вы можете установить пакет LinqKit Nuget.

Использование этого кода позволит вам генерировать динамические запросы «на лету» и не позволит вам писать тонны операторов if/else.

Заявления вроде ...

p => p.Price > 100 && 
p.Price < 1000 && 
(p.Description.Contains ("foo") || p.Description.Contains ("far")) 

будет порождаемые такого кода:

var inner = PredicateBuilder.False<Product>(); 
inner = inner.Or (p => p.Description.Contains ("foo")); 
inner = inner.Or (p => p.Description.Contains ("far")); 

var outer = PredicateBuilder.True<Product>(); 
outer = outer.And (p => p.Price > 100); 
outer = outer.And (p => p.Price < 1000); 
outer = outer.And (inner); 

Я думаю, что это довольно опрятно, и это также даст вам понимание того, как мощные выражения возможно.

0

Здесь у вас есть 1 запрос со всеми условиями:

public List<object> Search(string colour, string size, string name) 
{ 
    var query = from c in MyTable 
     where 
      (string.IsNullOrEmpty(colour) || c.colour == colour) && 
      (string.IsNullOrEmpty(size) || c.size == size) && 
      (string.IsNullOrEmpty(name) || c.name == name) 
     select c; 

    return query.ToList(); 
}