私はマネージャがサインオフする必要があるフォームのリストを持つテーブルを用意しています。 。C#Linq Nullable INTフィールド内にリストが含まれています SQLの翻訳
私はマネージャのスタッフのリストを取得し、それをスタッフIDのリストに入れます。
var staffIds = manager.Staff.Select(x => x.Id).ToList();
次に、スタッフのリストを使用してフォームのリストをフィルタリングします。
フォームは、「最初に署名されていない - それはIdが、その後、フォームには、次のいずれかと一致するかどうかをチェックし、既に拒否されているすべてのフォームを削除し、認証機関に一致し、私はすべてのフォームを取得
そのフォームを提出したスタッフは認証されたスタッフによって管理される。
又は
形態は、最初の兆候をオフたスタッフを「最初のサインオフ」としない「第二のサインオフ」と認証されたスタッフ管理されています。
var forms = (from item in DbContext.Forms
where item.OrganisationId == authenticatedOrganisationId
&& item.RejectStaffId == null
&& ((item.FirstSignOffStaffId == null && staffIds.Contains(item.StaffId))
|| (item.FirstSignOffStaffId != null
&& item.SecondSignOffStaffId == null
&& staffIds.Contains(item.FirstSignOffStaffId.Value)))
select item).ToList();
実行されているSQLが問題です。私は、SQLのように見えることを期待する何か -
SELECT *
FROM [Forms]
WHERE [OrganisationId] = 1
AND [RejectStaffId] IS NULL
AND (([FirstSignOffStaffId] IS NULL
AND [StaffId] IN (1,2,3,4))
OR ([FirstSignOffStaffId] IS NOT NULL
AND [SecondSignOffStaffId] IS NULL
AND [FirstSignOffStaffId] IN (1,2,3,4)))
しかし、その代わりに、それはその後、これは時間をかけて非常に大きくなり、すべてのフォームを(メモリ内の残りの部分を意味しないので
SELECT *
FROM [Forms] AS [item]
WHERE ([item].[OrganisationId] = 1)
AND [item].[RejectStaffId] IS NULL
を実行しますデータセット)が返されます。
私は何を発見したことは、それは私が
staffIds.Contains(item.FirstSignOffStaffId.Value)
を追加するときに、フィールド「FirstSignOffStaffIdは」NULL可能INTで、これは「StaffId」はその罰金をフィールドが、これと同じように送信されるSQLを破るように見える壊れるということですINTフィールドです。
誰でも、NULL入力可能なINTフィールドで正しく動作させる方法を知っていますか? EFコアと
あなたは使用しているどのようなORM?通常、メソッドがサポートされていない場合は、クエリを切り捨てるのではなく、実行時にエラーがスローされます(特に、クエリのその時点で切り捨てられないため)。 'リスト'の代わりに –
Rob
EFコア1.1 - それをリストにしようとしました –
'.Value'を取り除いても? – Rob