4

私はC#3.5を使用していますIList<MyItemLinkProperty>。ここでMyItemLinkProperty、はアイテムとそのプロパティ(1つまたは複数)の間のリンクを表します。ItemId、、がPropertyIdありPropertyValueます。このリストItemIdでは、アイテムに多くのプロパティ、色、サイズなどが含まれる可能性があるため、何度も発生する可能性があります(この種のリストがあり、アイテムエンティティにマップされていないのは、パフォーマンスに関連する問題です)。

                  ItemID  PropId  PropValue
itemProperty1 = { 1001,   1,      'Red' }
itemProperty2 = { 1001,   2,      'Small' }
itemProperty3 = { 1002,   1,      'Red' }
itemProperty4 = { 1002,   3,      'Medium' }
itemProperty5 = { 1003,   4,      'Green' }
itemProperty6 = { 1003,   2,      'Small' }

次に、プロパティAとプロパティBを持つすべてのアイテムを検索する必要があります。たとえば、「red」と「small」です。ItemIDこれにより、これらの両方のプロパティを持つ1001が得られるはずです。

擬似コードでは、「プロパティIDが1または2で、アイテムIDが同じアイテムを教えてください」と思っています。次に、これらの両方のプロパティを持つアイテムを取得しました。

linqクエリでそれができると思います。しかし、これが機能するようになっておらず、行き詰まっています。たぶん私はここで私の心をブロックし、それを考えて複雑にしすぎています...

これに対する最善の解決策のヒントはありますか?

4

3 に答える 3

5

ItemID次のように、でグループ化してから、各グループにすべての値が含まれているかどうかを調べる必要があります。

var smallRedIds = allItems
    .GroupBy(i => i.ItemID)
    .Where(g => g.Any(x => x.PropId == 1 && x.PropValue == "Red")
             && g.Any(x => x.PropId == 2 && x.PropValue == "Small"))
    .Select(g => g.Key);

これにより、「small」プロパティと「red」プロパティの両方を持つすべてのアイテムIDの列挙が生成されます。

于 2013-01-31T11:28:11.903 に答える
2

私は同様の問題に遭遇し、JOINを使用してそれを解決しました。次に、動的クエリを生成するために簡単に使用できます。

int[] propertyIds = new []{1,2,3,4};
var query = dc.ItemProperties.Where(i=> i.PropId == propertyIds[0]);

for (int i = 1; i < catsGroups.Length;i++)
{
    query = query.Join(dc.ItemProperties.Where(i=> i.PropId == propertyIds[i]), x => x.IDItem, x => x.IDItem,(x, y) => x);
}
return input;

これにより、必要なすべての列を(GROUP BYとは異なり)投影できるという利点があります。これは、場合によっては役立つ可能性があります。また、生成されたSQLのパフォーマンスは非常に優れています(Anyまたはを使用する場合のようなサブクエリはありませんAll

于 2013-01-31T13:23:16.853 に答える
1

必要なプロパティのリストを定義できます。例:

var desiredProperties = new[]{ "Red", "Small" };

Enumerable.All次に、を使用できますContains

var allMatchingItemProperties = allItemProperties
    .Where(ip => desiredProperties.All(dp => ip.Properties.Contains(dp)));
于 2013-01-31T11:29:43.960 に答える