1

これをクエリする最適化された方法を考え出そうとしているので、これはしばらくの間私を悩ませてきました。

したがって、共通の列を共有する 3 つの相互参照テーブルがあるとします。その共通の列は、より多くの情報を含むメイン テーブルで最終的な結合を行います。

例えば:

私が次のものを持っているとしましょう:

 Customers //properties: ID, Name, Address
 IEnumberable<CustomerSports> //properties: CustomerID, SportsID
 IEnumberable<CustomerLocation> //properties: CustomerID, LocationID
 IEnumberable<CustomerPets> //properties: CustomerID, PetsID

したがって、次のようなクエリを作成できます。

ニューヨーク (CustomerLocation) に住んでいて、ラクロス、フットボール、サッカー (CustomerSports) をしていて、犬や猫を飼っている (CustomerPets) 顧客のリストを教えてください。ルックアップ テーブルは null 許容にできるため、顧客はスポーツをすることができますが、ペットは飼っていません。

次に、顧客のリストを取得したら、顧客テーブルの共通列 (CustomerID) を結合して、ID、名前、および住所を取得します。

ルックアップごとに顧客テーブルを結合し、ユニオンを実行して顧客のリストを取得することを考えていましたが、それが正しい方法であるかどうかはわかりません。

4

2 に答える 2

5

デザインを正しく設定している限り、それぞれCustomerSportsコレクション、Petsコレクション、およびLocations(この最後のものが 1 対 1 の結合でない限り?) が必要です。

これらの関係が設定されている場合は、次のようにクエリを実行できます。

var sports = new string[] { "lacrosse", "football", "soccer" };
var pets = new string[] { "cat", "dog" };
var locations = new string[] { "new york" };
var sportyPetLoversInNewYors = db.Customers
    .Where(cust => sports.All(sport => cust.Sports.Any(custSport => custSport.Name == sport)))
    .Where(cust => pets.All(pet => cust.Pets.Any(custPet => custPet.Name == pet)))
    .Where(cust => locations.All(loc => cust.Locations.Any(custLoc => custLoc.Name = loc)))
    // could customise the select here to include sub-lists or whatever
    .Select();

これは、6 つの基準をすべて満たす人だけが必要であると想定しています。これらのスポーツの少なくとも 1 つが好きで、ペットを少なくとも 1 匹飼っており、(複数の場所を使用したと仮定して) それらの場所の少なくとも 1 つにいる人が必要な場合、Where式は次のように変更されます。

.Where(cust => cust.Sports.Any(custSport => sports.Contains(custSport.Name)))

さらに説明が必要な場合はお知らせください。

于 2014-02-18T00:49:26.093 に答える