我有这样的查询:
if (catId == null || catId == 0)
{
productVM = db.Products
.Include(x => x.Category)
.ToArray()
.Select(x => new ProductVM(x))
.ToList();
}
else
{
productVM = db.Products
.Include(x => x.Category)
.ToArray()
.Where(x => x.CategoryId == catId)
.Select(x => new ProductVM(x))
.ToList();
}
这样可行,但正如您所看到的,2个查询之间的唯一区别是.Where(x => x.CategoryId == catId)
。
有更优雅的方式来写这个吗?
答案 0 :(得分:3)
在您实现数据之前,实体框架实际上并不查询数据库,例如使用ToList()
或迭代结果。因此,您可以随时构建查询,而无需访问数据库:
var query = db.Products.Include(x => x.Category);
if(catId != null && catId != 0)
{
//Add a where clause
query = query.Where(x => x.CategoryId == catId);
}
productVM = query
.ToList()
.Select(x => new ProductVM(x));
请注意,我删除了ToArray
调用,因为它也实现了数据,这意味着数据上的每个后续方法都是从数据库中作用于整个表。
答案 1 :(得分:1)
另一种方式。
var products = db.Products.Include(x => x.Category).ToArray()
if (catId == null || catId == 0)
{
productVM = products.Select(x => new ProductVM(x)).ToList();
}
else
{
productVM = products.Where(x => x.CategoryId == catId)
.Select(x => new ProductVM(x)).ToList();
}
答案 2 :(得分:1)
您可以展开Where语句以在catId上包含null或0的测试。如果数据库中的字段catId可以为空或者值为0,则这可能不起作用。
productVM = db.Products
.Include(x => x.Category)
.Where(x => catId == null || catId == 0 || x.CategoryId == catId)
.Select(x => new ProductVM(x))
.ToList();
此外,您应该删除ToArray(),因为它从数据库中查询整个Products表,然后在客户端的内存中执行过滤和投影。
答案 3 :(得分:0)
只需重新分配查询:
var query = db.Products;
if (condition)
query = query.Where(criteria);
var list = query.ToList();