过滤器在Nullable int上崩溃但是直接查询没有? LINQ2SQL

时间:2016-09-10 08:54:01

标签: sql .net vb.net linq-to-sql

我对这个问题感到头疼,并且对于为什么会发生这种情况感到好奇。

下面的代码,第一个例子运行正常。然而,后两者却没有。

这些在我的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

1 个答案:

答案 0 :(得分:2)

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

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

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