0

经过数小时的谷歌搜索和 stackoverflow 搜索,我迫切需要您对 Linq 问题的帮助。

想象两个表:

表 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),则 Linq 查询将仅返回产品 1,因为它至少包含 1 和 3 FeatureID。

我发现类似于下面的 SQL 查询,但“IN”运算符(或 Linq 中的“包含”函数)返回包含 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

我假设一种产品没有超过一个相同类型的功能。

于 2012-09-23T15:22:15.873 回答
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 回答
0

非常感谢您的所有帮助……您的迅速反应和出色的回答对我来说是真正的救星。

我将缓存这些表(使用 SQLDataReader 查询 SQL Server 并使用这两个表加载数据集),每次我从缓存中检索它们时,我都会使用 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 回答