Vb.net Lambda表达式创建多个查询
我对system.function有一个奇怪的LINQ问题。如果Lambda表达式包含datacontext两次,它将生成多个SQL查询,而不是(参见第二个)一个SQL查询 首先 第二Vb.net Lambda表达式创建多个查询,vb.net,linq,lambda,Vb.net,Linq,Lambda,我对system.function有一个奇怪的LINQ问题。如果Lambda表达式包含datacontext两次,它将生成多个SQL查询,而不是(参见第二个)一个SQL查询 首先 第二 Dim tasksNoLambda = (From task In myDataContext.tasks Where (From i In myDataContext.taskInfo Where i.taskId = task.id).Any()) taskList = tasksNoLambda .ToL
Dim tasksNoLambda = (From task In myDataContext.tasks Where (From i In myDataContext.taskInfo Where i.taskId = task.id).Any())
taskList = tasksNoLambda .ToList
'generates only one select to tasks with subselect to taskinfo on SQL Server Profiler -> good
您能解释一下为什么它会进行多个查询而不是子查询和/或这两个Lambda查询之间的区别吗
提前感谢,
丹尼尔
指数据源提供的集合myDataContext.tasks
是一个必须在客户端计算的表达式,因为.Where(whereFunction)
通常无法转换为SQL表达式(它正在构造新的匿名对象,我相信没有SQL转换)whereFunction
- 函数中的
再次引用数据源myDataContext.taskInfo
Dim whereFunction As Func(Of tasks, Boolean) = _
Function(task) (From i In myDataContext.taskInfo Where i.taskId = task.id).Any())
明白了。第二次尝试--尝试一下这个:
Dim whereFunction As System.Linq.Expressions.Expression(Of Func(Of tasks, Boolean)) = _
Function(task) (From i In myDataContext.taskInfo Where i.taskId = task.id).Any())
通过将变量表示为LINQ“表达式”,我认为它提高了LINQ将其转换为其他形式(如SQL)的能力。尝试这样做:
Dim tasksLambda = _
From task In myDataContext.tasks
Group Join i In myDataContext.taskInfo On task.id Equals i.taskId Into Group
Where Group.Any()
Select task
这将是你能做的最好的一个查询
如果这不起作用,那么您可以将
任务
和任务信息
记录拉入内存并在那里进行过滤。只要你没有太多的记录,这通常会更快。你正在进出IQueryable
。当一个查询跨越边界时,它必须进行单独的查询。如何防止@Enigmativity出现这些多个查询?我真的需要这个功能。谢谢你的快速回复@BlueMonkMN,但不幸的是它没有任何区别。还有这个问题。@daniel.didusch我想这次我明白了。你说的“BlueMonkMN”到底是什么意思?我无法用你的答案解决这个问题。@daniel.didusch你看到我的第二个答案了吗?当我使用这种方法时,它确实改变了我测试中的行为。这不是给你的吗?非常感谢@BlueMonkMN,我真的很感激!我将您的答案标记为正确。抱歉@Enigmativity,这不是我的目标,因为我需要返回Where-function。@daniel.didusch-如果您想返回Where子句并仅在查询时执行,那么您需要返回表达式(Func(Of tasks,Boolean))
,而不仅仅是Func(Of tasks,Boolean)
。
Dim tasksLambda = _
From task In myDataContext.tasks
Group Join i In myDataContext.taskInfo On task.id Equals i.taskId Into Group
Where Group.Any()
Select task