2016-12-07 17 views
0

私は最初の開発ロールに6ヶ月居ましたが、私たちのリポジトリレイヤでより多くのLINQを使用してDBクエリを開始しました。私は本当に私が作成した2つのクエリでいくつかのヘルプを使用することができます。WHERE句で複数の条件を指定したLINQクエリ

IQueryable<long> clientsWithoutFeature = from cf in db.Features 
       where cf.Feature != 9 && cf.Feature == 8 
       select cf.Client; 

IQueryable<long> clientsWithFeature = from cf in db.Features 
       where cf.Feature == 9 && cf.Feature == 8 
       select cf.Client; 

各クライアントは、それぞれが別個のレコード/行である複数の機能を持つことができます。

最初のクエリは、フィーチャが8でフィーチャが9ではないすべてのクライアントを返すことになっています。ただし、フィーチャが8のすべてのクライアントが返されます。

2番目のクエリは、8のフィーチャと9のフィーチャを持つすべてのクライアントを返します。ただし、クライアントは返されません。

誰かが私の質問に間違っていると教えてもらえますか?

+3

条件はそれぞれ独立した行に適用されたザ・は、同じ行/レコードが複数の値を持つ2つの「機能」の列を持っています。私はあなたの質問が正しいとは思わない。 Linqの問題ではありません。私はLinqに慣れていませんが、クエリは "not in"句を含むネストされたクエリとして構築する必要があります –

+0

モデルを表示することを検討してください。 –

答えて

1

あなたのSQLはあなたが書いたとおりに動作しています。あなたは、あなたが実際に意図したものを表現するために少し質問を再構成する必要があります。

私はそうのようなサブクエリのアプローチを使用する傾向がある:あなたの主キー列が何であるかを

IQueryable<long> clientsWithoutFeature = from cf in db.Features 
       where cf.Feature == 8 && !db.Features.Any(x => x.id == cf.id && x.Feature == 9) 
       select cf.Client; 

IQueryable<long> clientsWithFeature = from cf in db.Features 
       where cf.Feature == 8 && db.Features.Any(x => x.id == cf.id && x.Feature == 9) 
       select cf.Client; 

イム本当にわからないが。だから私はちょうどそれがidYだったと推測した

+0

これはすばらしい答えであり、最終的に私の問題を解決するために行ったものです。ありがとう@meganaut –

0

それは非常に簡単です。 Featuresは、個々の行がFeature89の両方を持つことができないテーブルです。あなたがJOINを必要と欲しいものを得るために

IQueryable<long> clientsWithoutFeature = from cf1 in db.Features 
join cf2 in db.Features on new { cf1.Client, IsTargetFeature = true } 
    equals new { cf2.Client, IsTargetFeature = cf2.Feature = 8 } 
where cf1.Feature != 9 
select cf1.Client; 

IQueryable<long> clientsWithFeature = from cf1 in db.Features 
join cf2 in db.Features on new { cf1.Client, IsTargetFeature = true } 
    equals new { cf2.Client, IsTargetFeature = cf2.Feature = 8 } 
where cf1.Feature == 9 
select cf1.Client;