根据条件追加WHERE进行查询

时间:2016-11-20 11:51:18

标签: c# entity-framework

我有这样的查询:

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)

有更优雅的方式来写这个吗?

4 个答案:

答案 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();