繁体   English   中英

LINQ to SQL复杂查询

[英]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列表,假设列表包含FooBar ,我想动态构建一个这样的查询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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM