我对这个问题感到头疼,并且对于为什么会发生这种情况感到好奇。
下面的代码,第一个例子运行正常。然而,后两者却没有。
这些在我的LinqPad中运行,并且表模式使得我正在使用的列是可空的(整数)但不是主键。我已经使表格的默认值为0,以便将来插入但不影响历史项目。
我的项目代码现在有一行故意从该字段中排除空值,因此它可以正常工作,但是我担心这会在其他地方发生,并且希望将其捕获到数据层而不是让每个调用者都这样做。
编辑:任务是SQL Server 2008 db中的表,具有以下架构:
CREATE TABLE [dbo].[Tasks](
[TaskID] [int] IDENTITY(1,1) NOT NULL,
[JobHeaderID] [int] NOT NULL,
[Sequence] [int] NOT NULL,
[CreateBy] [int] NOT NULL,
[CreateOn] [datetime2](7) NULL,
[EditOn] [datetime2](7) NULL,
[EditBy] [int] NULL,
[DeleteOn] [datetime2](7) NULL,
[DeleteBy] [int] NULL,
[VehicleSaleID] [int] NULL CONSTRAINT [DF_Tasks_VehicleSaleID] DEFAULT ((0))
)
感激不尽的任何帮助!
Sub Main
Dim x = Tasks.Where(Function(s) s.VehicleSaleID = 142).FirstOrDefault
x.dump ' I work
Dim t2 = find(Function(i) i.VehicleSaleID = 142) 'I do not. Why?
t2.dump
Dim t = find(Function(i) i.VehicleSaleID = 142) 'I do not. Why?
t.dump
End Sub
Private Function Find(filter As Func(Of Tasks, Boolean)) As Tasks
Return Tasks.Where(filter).FirstOrDefault
End Function
Private Function Find2(filter As Func(Of Tasks, Boolean)) As Tasks
Dim _t = Tasks.tolist
Return _t.Where(filter).FirstOrDefault
End Function
答案 0 :(得分:2)
使用Func
而不是方法的Expression(Of Func(Of Tasks, Boolean))
参数。
(注意:我不得不猜测语法,通常我在C#中工作)
你可能(至少,它在C#中的工作方式))不需要改变调用方法的方式,编译器将从lambda转换为表达式。
Func
强制使用" linq到对象",它将使用.net限制在内存中执行查询。 Expression
可以与" linq一起用于sql"和"实体框架",因为它可以被翻译成SQL - 所以它使用的是sql限制。