2016-09-10 2 views
0

私はこの1つの上に頭を傷つけています、なぜこれが起こっているのか不思議です。Nullable intではフィルタがクラッシュしますが、直接クエリではクラッシュしませんか? Linq2SQL

以下のコードは、最初の例でうまくいきます。しかし、後者の2つはそうではありません。

これらは私のLinqPadで実行され、使用している列は(整数の)NULL可能ですが、主キーではありません。私は将来の挿入のためにテーブルのデフォルトを0にしましたが、履歴項目には影響しません。

私のプロジェクトコードには、このフィールドから意図的にヌルを除外したラインがありますが、これはうまく動作しませんが、これはどこかで発生し、すべての呼び出し元にデータレイヤーでトラップしたいと思っています。

編集:タスクの次のスキーマを使用してSQLサーバー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)) 
) 

ありがたく受け取ったすべてのヘルプ!代わりにあなたの方法、使用Expression(Of Func(Of Tasks, Boolean))からFuncパラメータの

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

「タスク」とは – Blorgbeard

+0

Blorgbeardを指摘してくれてありがとう! –

答えて

2

。 (NB:構文で推測する必要がありましたが、通常はC#で動作します)

おそらく(少なくともC#で動作する方法です)メソッドを呼び出す方法を変更する必要はありません。コンパイラはあなたのラムダから式に変換します。

Funcは、 "linq to objects"の使用を強制します。これは、.netの制限でメモリ内でクエリを実行します。 Expressionは "linq to sql"と "entity framework"と共に使用することができます。これはSQLに変換できるため、SQLの制限を使用しています。

+0

ありがとうございます。それはそれを説明する。私はそれを試し、あなたに知らせるでしょう。 –

+0

あなたの先生は非常に親切です。私は約40秒で作業しなければならない答えですぐに戻ってきました。ありがとうございました!! –

関連する問題