2017-03-17 7 views
2

私はマネージャがサインオフする必要があるフォームのリストを持つテーブルを用意しています。 。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コアと

+0

あなたは使用しているどのようなORM?通常、メソッドがサポートされていない場合は、クエリを切り捨てるのではなく、実行時にエラーがスローされます(特に、クエリのその時点で切り捨てられないため)。 'リスト'の代わりに – Rob

+0

EFコア1.1 - それをリストにしようとしました –

+0

'.Value'を取り除いても? – Rob

答えて

0

のために参照し、List <int?>のためにローカルで実行するためにContainsの行動であるように思わstaffIds(クエリ式で型キャストを避けるために)nullablesのリストを確認します。このように:

のIQueryableは、抽象化の悪い例である理由です
var staffIds = manager.Staff.Select(x => (int?)x.Id).ToList(); 

:あなたはまだ根本的なプロバイダについて多くを知っている必要があります...

関連する問題