如何在Linq lambda中使用具有不同where子句的两个条件

本文关键字:子句 where 条件 两个 lambda Linq | 更新日期: 2023-09-27 18:15:10

我想在Items表中查询我的项目,其中每个项目的最后更新必须小于91天(从上次更新到现在)并且数量> 0。这是我在模型中的代码:

public IList<Item> GetAllProducts()
{
 var ien_item = from i in this.DataContext.Items  
 orderby i.LastUpdated descending
 select i;
 return ien_item.ToList().Where(
                 s =>
                 HelperClasses.HelperClass.IsLastUpdate(s.LastUpdated.Value) == true 
                 && 
                 (s => s.Quantity) > 0
                 )
                 .ToList();
}

有人能解出来吗?谢谢。

如何在Linq lambda中使用具有不同where子句的两个条件

我们真的不知道哪里出了问题。编辑:梅林发现了它;你的lambda语法混乱了。不过,这里还有更多的事情要做。

然而,我认为你会想要这个:

public IList<Item> GetAllProducts()
{
     var lastUpdateLimit = DateTime.UtcNow.Date.AddDays(-91);
     var query = from item in DataContext.Items
                 where item.Quantity > 0 && item.LastUpdated >= lastUpdateLimit
                 orderby item.LastUpdated descending
                 select item;
     return query.ToList();
}

注意,这可以在数据库端执行所有查询,而不是在客户端获取所有项并进行过滤。它确实假设HelperClasses.HelperClass.IsLastUpdate是简单的,并且基本上等同于我上面的过滤器。

(另一点要注意的是,通过计算UtcNow.Date 一次,结果将与所有项目一致-然而,如果您的代码在每次调用IsLastUpdate时计算"今天",查询中的一些值可能最终被过滤为不同的日期到其他值,由于时间的进展,而查询正在计算。)

编辑:如果你真的需要使用HelperClasses.HelperClass.IsLastUpdate,那么我建议:

public IList<Item> GetAllProducts()
{
     var query = from item in DataContext.Items
                 where item.Quantity > 0
                 orderby item.LastUpdated descending
                 select item;
     return query.AsEnumerable()
                 .Where(s => HelperClass.IsLastUpdate(s.LastUpdated.Value))
                 .ToList();
}

…那么至少数量过滤器是在数据库端执行的,并且在需要之前,您不会创建完整的缓冲列表(注意对ToList的单个调用)。

问题出在lambda语法上。你试图在定义第一个的时候定义第二个。虽然这是可以做到的,并且在某些上下文中很有用,但这是一种高级场景,在您确定需要之前可能不会对您有用。

现在,你不需要它。除非你知道你需要它,否则你不需要它:)

,

而不是你写的:

.Where(
    s =>
        HelperClasses.HelperClass.IsLastUpdate(s.LastUpdated.Value) == true 
            && (s => s.Quantity) > 0
    )

改为:

.Where(
    s =>
        HelperClasses.HelperClass.IsLastUpdate(s.LastUpdated.Value) == true 
            && s.Quantity > 0 // Notice I got rid of the extra lambda here
    )

如果你病态好奇:

你得到的编译错误是因为你没有正确定义第二个lambda。它重新定义了一个您已经使用过的变量(s),并且您试图检查alambda是否大于零。这没有道理。您只能将lambda的结果与某个值进行比较。这就像调用一个函数。你不会将函数与数字进行比较——你会将调用函数时得到的结果与数字进行比较。

Easy…

public IList<Item> GetAllProducts()
{
     var ien_item = 
          from i in DataContext.Items
          where 
               HelperClasses.HelperClass.IsLastUpdate(i.LastUpdated.Value)
               && s.Quantity > 0
          orderby i.LastUpdated descending
          select i;
     return ien_item.ToList();
}

Linq to SQL:不允许使用方法(Linq不是魔法,不能将c#方法转换为TSQL)
http://msdn.microsoft.com/en-us/library/bb425822.aspx

Linq to Object:虽然看起来一样,但它比Linq to SQL强大得多…但是不能查询SQL数据库:)
http://msdn.microsoft.com/en-us/library/bb397919.aspx

Linq to XML:与Linq to Object相同,带有XML对象
http://msdn.microsoft.com/en-us/library/bb387098.aspx

Linq to Dataset:不同于Linq to SQL !
http://msdn.microsoft.com/en-us/library/bb386977.aspx

其他linq提供程序:
http://en.wikipedia.org/wiki/Language_Integrated_Query