Linq带有可选的WHERE选项

Cra*_*aig 5 c# sql linq

我有一个接受3个参数的.Net函数,都是可选的.像这样的东西:

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

我的问题是,做这where部分的最佳方法是什么.最好是创建动态linq吗?在linq中,具有可选where参数的最佳模式是什么?

所以,在SQL中,这样的事情:

SELECT *
FROM MyTable
WHERE (@colour <> '' AND colour = @colour)
  AND (@size <> '' AND size = @size)
  AND (@name <> '' AND name = @name)
Run Code Online (Sandbox Code Playgroud)

但我希望在linq中有一个更简洁,更可接受的模式.

hbu*_*ens 6

在这种情况下,我建议您使用PredicateBuilder来生成您的查询。您可以从此处复制代码,也可以安装 LinqKit Nuget 包。

使用此代码将允许您即时生成动态查询,并防止您编写大量 if/else 语句。

诸如此类的声明...

p => p.Price > 100 &&
 p.Price < 1000 &&
 (p.Description.Contains ("foo") || p.Description.Contains ("far"))
Run Code Online (Sandbox Code Playgroud)

将由这种代码生成:

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);
Run Code Online (Sandbox Code Playgroud)

我认为这是相当简洁的,它也会让您了解表达式的强大功能。


Fab*_*bio 5

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();
Run Code Online (Sandbox Code Playgroud)

另一种方法是仅在需要时添加条件

var query = context.MyTable;

if (color != null) query = query.Where(t => t.Color == color);
if (size != null) query = query.Where(t => t.Size == size);
if (name != null) query = query.Where(t => t.Name == name);

var result = query.ToList();
Run Code Online (Sandbox Code Playgroud)