【问题标题】:Where filter crashes on Nullable int but direct query does not? Linq2SQL过滤器在 Nullable int 上崩溃但直接查询不会崩溃? LINQ2SQL
【发布时间】:2016-09-10 08:54:01
【问题描述】:

我对这个问题摸不着头脑,很好奇为什么会发生这种情况。

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

这些在我的 LinqPad 中运行,并且表模式使得我使用的列是可空的(整数)但不是主键。我已经为将来的插入设置了该表的默认值 0,但不会影响历史项目。

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

编辑:Tasks 是 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

【问题讨论】:

  • Tasks 是什么?
  • 感谢您指出 Blorgbeard!

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


【解决方案1】:

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

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

Func 强制使用“linq to objects”,这将在内存中执行具有 .net 限制的查询。 Expression 可以与“linq to sql”和“实体框架”一起使用,因为它可以被翻译成 SQL - 所以它使用了 sql 限制。

【讨论】:

  • 谢谢。这就解释了。我会尝试并告诉你。
  • 您先生很客气:您回复得这么快,我在大约 40 秒内就开始工作了。谢谢!!
猜你喜欢
  • 2018-12-11
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 2023-04-05
  • 2011-11-22
相关资源
最近更新 更多