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

时间:2011-11-18 07:05:32

标签: c# asp.net asp.net-mvc

我想在表项目中查询我的项目,其中每个项目的最后更新必须少于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();

}

任何人都可以解决它吗?谢谢。

3 个答案:

答案 0 :(得分:3)

我们真的不知道这里有什么用。编辑:Merlyn发现了它;你的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 一次,结果将对所有项目保持一致 - 而如果您的代码在每次调用{{{ 1}},由于查询评估时间的推移,查询中的某些值最终可能会针对其他值的不同日期进行过滤。)

编辑:如果确实需要使用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(); } 的单次调用)。

答案 1 :(得分:2)

问题是你的lambda语法。你正试图在定义第一个lambda的过程中定义第二个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),并且您试图检查 lambda 是否大于零。这是没有意义的。您只能将lambda的结果与某个值进行比较。这就像调用函数一样。您不会将函数与数字进行比较 - 您将调用函数时得到的结果与数字进行比较。

答案 2 :(得分:0)

容易......

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要强大得多......但是无法查询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