【发布时间】:2023-04-01 15:28:01
【问题描述】:
我在数据库中有一个 Products 和 Category 表:
产品具有以下列: ProductId、ProductName、描述、路径、名称、URL、CategoryId、活动
类别具有以下列: 类别 ID、类别名称
我编写了一个 LINQ 语句来查询数据库并获取相关类别的产品。查询工作正常。
public IQueryable<Product> GetProducts(
[QueryString("id")] int? categoryId,
[RouteData] string categoryName)
{
var _db = new products.Models.ProductContext();
IQueryable<Product> query = _db.Products;
if (categoryId.HasValue && categoryId > 0)
{
query = query.Where(p => p.CategoryID == categoryId);
}
if (!String.IsNullOrEmpty(categoryName))
{
query = query.Where(p =>
String.Compare(p.Category.CategoryName,
categoryName) == 0);
}
return query;
}
我有两个疑问:
如何修改此查询以仅选择 Active = 1 的那些产品。
目前,查询以我认为基于 productId - 1、2、3、4、5 等的特定顺序返回行。如何对结果进行随机排序,以便不以特定顺序返回结果.它可以是 5、2、4、1、3 或下一次运行 3、5、1、4、2 等等。
【问题讨论】:
-
是否返回
IQueryable<Product>是一个要求,例如,是否允许更改方法的签名以返回IEnumerable<Product>?如果不是,是否允许在方法内部实现查询? -
如果我将其更改为 IEnumerable,它将如何受益/解决我的要求?
-
受益 - 不,解决 - 是(第二部分 - 随机化)。看看现在的答案。我认为没有办法使用
IQueryable进行随机化。这就是我们需要具体化(即执行)查询然后随机化的原因。当然,我们总是可以将 enumerable 变成 queryable,但这会扼杀对 db 的 queryable 的整个想法。 -
保留签名并添加
p.Active == 1标准可能会更好。通过这种方式,您可以使用该函数并应用“Count()”或添加条件或选择等。并创建另一个进行随机化的通用方法。听起来不错?