Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 将lambda传递给Where语句_Linq_Linq To Sql_Lambda_Expression_Linq Expressions - Fatal编程技术网

Linq 将lambda传递给Where语句

Linq 将lambda传递给Where语句,linq,linq-to-sql,lambda,expression,linq-expressions,Linq,Linq To Sql,Lambda,Expression,Linq Expressions,我今天注意到,如果我这样做: var items = context.items.Where(i => i.Property < 2); items = items.Where(i => i.Property > 4); var items = context.items.Where(i => i.Property < 2).Where(i => i.Property > 4); 导致 SELECT [Fields] <== edited

我今天注意到,如果我这样做:

var items = context.items.Where(i => i.Property < 2);
items = items.Where(i => i.Property > 4);
var items = context.items.Where(i => i.Property < 2).Where(i => i.Property > 4);
导致

SELECT [Fields] <== edited
FROM [dbo].[Assessment] AS [t0]
INNER JOIN [dbo].[AssessmentComment] AS [t1] ON [t1].[ID] = [t0].[AssessmentID] <== because of load options

选择[Fields]您使用的查询提供程序是什么?对于任何合理的提供者,您的第一个示例应该在源代码(而不是内存)上执行,作为
Where
s中两个条件的结合

至于您的问题,不,这不是手动构建
表达式的正确方法。您的第一个定义很好,但要构建连接,您需要使用


人们已经将其打包到一个库中供您使用。请参阅。

使用动态构造查询。

我认为第一个和第二个不同的原因是
项在该点已经访问了数据。如果将
对象从
IQueryable
继承,则在实际访问集合中的项之前,不会针对上下文执行任何操作

“我想第一个和第二个不同的原因是items已经访问了该点的数据。”不,不应该,因为查询从未迭代过(至少在代码呈现给我们时是如此)。@Jason,这段代码不可能使用linq,第一个执行,第二个不执行,可能是在quick watch中看到第一个并执行ToList()和第一个。我使用的是IEnumerable而不是IQueryable。Where()的两种不同实现。
IQueryable assessments = assessmentContext.Assessments;
metAssessments = metAssessments.Take(pageSize);
SELECT [Fields] <== edited
FROM [dbo].[Assessment] AS [t0]
INNER JOIN [dbo].[AssessmentComment] AS [t1] ON [t1].[ID] = [t0].[AssessmentID] <== because of load options