我有一个接受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中有一个更简洁,更可接受的模式.
在这种情况下,我建议您使用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)
我认为这是相当简洁的,它也会让您了解表达式的强大功能。
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)
| 归档时间: |
|
| 查看次数: |
2701 次 |
| 最近记录: |