gpt4 book ai didi

c# - 在 MVC 应用程序的连接查询中使用 Linq to SQL 的动态 where 子句

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:48 25 4
gpt4 key购买 nike

我正在寻找一种方法,使用基于产品所属类别分配给产品的属性过滤器来查询目录中的产品。所以我涉及以下实体:

产品 -ID -CategoryId

类别 [ID、名称、网址名称]

属性 [Id, CategoryId, Name, UrlName]

属性值 [Id, PropertyId, Text, UrlText]

ProductPropertyValues [ProductId, PropertyValueId]

当我将产品添加到目录时,将根据类别添加多个 ProductPropertyValues,我希望能够通过选择一个或多个属性的值来过滤类别中的所有产品。业务逻辑和 SQL 索引和约束确保所有 UrlName 和文本对于值属性和类别都是唯一的。

解决方案将是一个基于 MVC3 EF 代码优先的应用程序,路由设置如下:

/products/{categoryUrlName}/{*filters}

过滤器路由部分的长度可变,因此可以应用多个过滤器。每个过滤器都包含属性的 UrlName 和值的 UrlText,用下划线分隔。

一个 url 可能看起来像这样/products/websites/framework_mvc3/language_csharp

我将通过读取 URL 来收集所有过滤器,并将其保存在列表中。现在是实际获得基于多个属性的产品的时候了,我一直在努力寻找正确的策略。

也许还有另一种实现过滤器的方法。所有较大的网上商店都使用类别依赖过滤器,我仍在寻找为此类功能实现持久性部分的最佳方法。如果选择了多个过滤器,建议的解决方案会产生“或”结果集。我可以想象,将文本属性添加到产品表(其中所有属性值都存储为连接字符串)也可以。我不知道这会对性能造成什么影响。至少不会有复杂的连接,属性及其值无论如何都将作为文本接收。

也许过滤机制也可以在客户端完成。

最佳答案

棘手的部分是将整个列表作为过滤器发送到数据库中。您建立越来越多的 where 子句可行的方法:

productsInCategory = ProductRepository
.Where(p => p.Category.Name == category);

foreach (PropertyFilter pf in filterList)
{
PropertyFilter localVariableCopy = pf;
productsInCategory = from product in productsInCategory
where product.ProductProperties
.Any(pp => pp.PropertyValueId == localVariableCopy.ValueId)
select product;
}

另一种方法是使用 List.Contains 方法发送整个列表

List<int> valueIds = filterList.Select(pf => pf.ValueId).ToList();

productsInCategory = ProductRepository
.Where(p => p.Category.Name == category)
.Where(p => p.ProductProperties
.Any(pp => valueIds.Contains(pp.PropertyValueId)
);

关于c# - 在 MVC 应用程序的连接查询中使用 Linq to SQL 的动态 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2930124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com