我想在表项目中查询我的项目,其中每个项目的最后更新必须少于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();
}
任何人都可以解决它吗?谢谢。
答案 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