如何在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();
}
有人能解出来吗?谢谢。
我们真的不知道哪里出了问题。编辑:梅林发现了它;你的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