Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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
Vb.net Lambda表达式创建多个查询_Vb.net_Linq_Lambda - Fatal编程技术网

Vb.net Lambda表达式创建多个查询

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

我对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 .ToList 
'generates only one select to tasks with subselect to taskinfo on SQL Server Profiler -> good
您能解释一下为什么它会进行多个查询而不是子查询和/或这两个Lambda查询之间的区别吗

提前感谢,

丹尼尔

  • myDataContext.tasks
    指数据源提供的集合

  • .Where(whereFunction)
    是一个必须在客户端计算的表达式,因为
    whereFunction
    通常无法转换为SQL表达式(它正在构造新的匿名对象,我相信没有SQL转换)

  • 函数中的
    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