2011-07-13 16 views
0

リストから除外する|スタート日|終了日のLINQのINステートメントは、私は2つのテーブル</p> <p><strong>契約</strong></p> <p>IDを持って

ExcludedContracts

同上| ContractID

私は両方のデータセットを取得するには、次のステートメントを使用しています:私はExcludedContractsテーブルのレコードを持っていないすべての契約を選択する必要が

  var excludedContracts = from Excluded in 
      DataContext.ExcludedTransportContracts 
            select Excluded; 

      // Get a collection of all live sites first 
      var liveContracts = from Contracts in DataContext.Contracts 
           where Contracts.EndDate > DateTime.Now 
           select Contracts; 

。私はしばらくの間WHEREのクエリと戦ってきたが、運がなかった。

私はinstatement IN(1,2,3)SQLと同様のクエリを実行するにはどうすればよいですか?

ありがとうございます!あなたもこの方法を除き、LINQを見るべきしかし

答えて

2

2つのテーブルがデータレベルで関連していませんか?つまり、ExcludedTransportContractsのリストをプロパティとして持つContractオブジェクトですか?

データの表情から、これは彼らが関連する方法おそらく、あなたはvar liveContract = DataContext.Contracts.Where(c => c.ExcludedTransportContracts.Count() == 0 && c.EndDate > DateTime.Now)

ような何かを行うことができ、コードは若干の変更が必要な場合がありますので、私の頭の上オフになっていました。

+0

これは最高でした、私は関係を正しく設定しなかったので、今度はContracts - > ExcludedContractsになりますので、私はちょうどこれを行うことができます。 Contracts.contractEndDate> DateTime.Now && Contracts.ExcludedTransportContracts.Count()= = 0 – nik0lias

+2

注: '!Contracts.ExcludedTransportContracts.Any()'は、Count == 0よりも効率的なSQLを証明します。 –

+0

大変ありがとうございます。 – nik0lias

2

LINQ中でのequivilentがあるhttp://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx含まhttp://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx

更新:それらが含まれているためにIEnumerableをものはそうhttp://msdn.microsoft.com/en-us/library/bb341422.aspxする必要があります述べたようとどの除いているためhttp://msdn.microsoft.com/en-us/library/bb348938.aspx照会可能

ため
+0

@DoctaがIQueryableで更新されました。 – Manatherin

3

は、私はあなたが使用しているどのクエリプロバイダ知らないが、そのクエリプロバイダがサポートしている場合は、この使用することができます方法は含まれています:

//get all contracts that haven't been excluded 
var nonExcludedContacts = liveContracts.Where(l => !excludedContracts.Contains(l)); 

このメソッドがサポートされていない場合は、代わりにAnyメソッドを使用できます。これは、読み取り可能ではありませんが、それは仕事を取得します:あなたは、このタスクのためEnumerable.Contains()機能を使用することができます

//get all contracts that haven't been excluded 
var nonExcludedContacts = liveContracts.Where(l => !excludedContracts.Any(e => e.ContractId == l.Id)); 
0

+0

例: var liveContracts =契約からDataContext.Contracts somelist.Contains(契約。契約書を選択してください。 –

0

このようなものを試してみてください。明らかに、 "Contains"メソッドを使用する場合は、同様のデータ型/オブジェクトを比較する必要があります。

コンパイラは、contains関数で暗黙の型付き変数を使用すると、おそらくコードをコンパイルしませんが、それについてはわかりません。

List<Contracts> excludedContracts = 
      (from Excluded in DataContext.ExcludedTransportContracts 
      select Excluded).toList(); 

List<Contracts> liveContracts = 
    (from Contracts in DataContext.Contracts 
    where Contracts.EndDate > DateTime.Now && 
      !excludedContracts.Contains(Contracts) 
    select Contracts).toList(); 
関連する問題