[英]LINQ to SQL complex query
我有以下对象
public Cell {
public string CategoryId {get; set;}
public DateTime FromTime {get; set}
public DateTime ToTime {get; set}
}
我有一个名为Item的数据库表,如下所示:
Item
-------------------------
CategoryId LastUpdated
现在在代码中我有一个包含多个List<Cell> ToBeFetchedFromDB
的Cell List<Cell> ToBeFetchedFromDB
列表,假设列表包含Foo
和Bar
,我想动态构建一个这样的查询BY INTERATING THROUGH THE COLLECTION ToBeFetchedFromDB WITHIN MY LINQ TO SQL QUERY
而不是静态构造查询:
from x in Item
where x.CategoryId == Foo.CategoryId && Foo.FromTime < x.LastUpdated < Foo.ToTime
|| x.CategoryId == Bar.CategoryId && Bar.FromTime < x.LastUpdated < Bar.ToTime
select x
我一直在尝试,但无法弄清楚:(
多谢你们!
使用PredicateBuilder,您可以使用foreach
列表中的每个项目,并为您的过滤器添加新选项:
var filter = PredicateBuilder.False<Item>();
foreach (var cell in ToBeFetchedFromDB)
{
filter = PredicateBuilder.Or(filter, item =>
item.CategoryId == cell.CategoryId &&
cell.FromTime < item.LastUpdated &&
item.LastUpdated < cell.ToTime);
}
var query = Item.Where(filter);
来自链接的PredicateBuilder
副本:
public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T>() { return f => true; }
public static Expression<Func<T, bool>> False<T>() { return f => false; }
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.