在可空的int上过滤器崩溃,但直接查询没有?Linq2SQL



我对这个问题感到挠头,我很好奇为什么会发生这种情况。

下面的代码,第一个例子工作得很好。而后两者则不然。

这些在我的LinqPad中运行,表模式是这样的,我使用的列是一个可空的(整数),但不是主键。对于未来的插入,我将表的默认值设置为0,但这不会影响历史项。

我的项目代码现在确实有一行故意从这个字段中排除null,所以它可以工作,但是我担心这会发生在其他地方,并希望在数据层捕获这个,而不是让每个调用者都这样做。

编辑:Tasks是SQL server 2008数据库中的一个表,模式如下:

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

在方法中使用Expression(Of Func(Of Tasks, Boolean))而不是Func参数。(注:我不得不猜测语法,通常我在c#中工作)

你可能(至少,这是它在c#中的工作方式))不需要改变方法的调用方式,编译器将从你的lambda转换为表达式。

Func强制使用"linq到对象",这将在内存中执行。net限制的查询。一个Expression可以使用"linq到sql"one_answers"实体框架",因为它可以被翻译成sql -所以它使用sql的限制。

最新更新