0

何時間にもわたってスタックオーバーフローをグーグルで検索した後、Linq の問題に関してあなたの助けがどうしても必要です。

次の 2 つのテーブルを想像してください。

表 A : 製品

ID(int)     | ProductName(varchar(50))
1___________|_______________A
2___________|_______________B
3___________|_______________C
...

表 B : 製品の特徴

ProductID(int)        | FeatureID(int)                | FeatureValue(smallint)
1_____________________|_________1_____________________|____________1
1_____________________|_________2_____________________|____________1  
1_____________________|_________3_____________________|____________0
2_____________________|_________1_____________________|____________0
2_____________________|_________2_____________________|____________1
3_____________________|_________1_____________________|____________1
3_____________________|_________2_____________________|____________1
...

例えば

FeatureID = 1 => "has WiFi" 
FeatureValue 1 = Yes / 0 = No.

表 C:機能説明表もあります

FeatureID int, 
FeatureName varchar(50)

私の ASP アプリケーションには、チェックボックスやドロップダウン リストなどのコントロールを含むパネルがあり、ユーザーは製品のリストをフィルター処理できます。

そのため、誰かが「ラップトップ」カテゴリを選択すると、ページにラップトップのリストが表示され、さらに結果を絞り込むために「WiFi あり」チェックボックスなどのフィルターをクリックできます。

私の問題:

最初に、フィルター コントロールは、要求された FeatureID を含むリストを作成します。

List<int> filters=getFilterPanelList(); 

製品の機能に少なくともフィルターリストが含まれる製品テーブルからすべての製品を選択するにはどうすればよいですか? (SQL または Linq スクリプト内)。

例: コントロールがリスト (1,3) を生成する場合、少なくとも 1 と 3 の FeatureID が含まれているため、Linq クエリは製品 1 のみを返します。

次の SQL クエリのようなものを見つけましたが、'IN' 演算子 (または Linq の 'Contains' 関数) は、FeatureID 1 または FeatureID 3 を含むが両方を含まないすべての製品を返します。

SELECT ProductID 
FROM 
    Products P
    JOIN ProductFeatures PF ON PF.ProductID = P.ID
WHERE 
    PF.ProductID IN

SELECT ProductID 
FROM 
    ProductFeatures 
WHERE 
    FeatureID IN @FilterList)"
4

3 に答える 3

0

Linq で:

from p in products
where p.ProductFeatures.Count(pf => filters.Contains(pf.FeatureID)) == filters.Count
select p

1 つの製品に同じタイプの機能が 2 つ以上あるとは限りません。

于 2012-09-23T15:22:15.873 に答える
0

助けてくれて本当にありがとう...あなたの迅速な対応と素晴らしい回答は、私にとって真の救世主でした.

これらのテーブルをキャッシュし (SQLDataReader を使用して SQL Server にクエリを実行し、これら 2 つのテーブルを含むデータセットをロードします)、キャッシュからそれらを取得するたびに、LINQ To DataSet を使用します。

そこで、リレーショナル除算の場合の SQL スクリプト (tc.umn.edu/~hause011/code/SQLexample.txt から) を変更し、以下の LINQ To DataSet スクリプトを作成しました。

List<int> FilteredProductIDs = 
      (from p1 in Products where !filters.Any(l => !Products.Any(
      p2 => (p2.Field<int>("ProductID") == p1.Field<int>("ProductID"))
                                  && (p2.Field<int>("FeatureID") == l)))
                            select p1.Field<int>("ProductID")).ToList<int>();

同様の問題を抱えている他の人に役立つことを願っています....ありがとうございました。

于 2012-09-24T05:25:59.297 に答える
0

この場合、両方の製品機能を備えた製品を取得する必要があります。だから私の提案はあなたのSQLを変更することです:

SELECT distinct PF.ProductID
FROM Products P
JOIN ProductFeatures PF ON PF.ProductID = P.ID WHERE PF.ProductID IN
( SELECT ProductID
FROM ProductFeatures
WHERE FeatureID IN (@FilterList) and FeatureValue=1 -- この条件を追加すると、すべての機能が保証されますどちらも「はい」を選択)

于 2012-09-23T17:10:00.507 に答える