MVC4 Linq查询优化

时间:2015-02-18 21:26:11

标签: c# asp.net-mvc linq asp.net-mvc-4

我有以下代码可以使用,但我觉得这不是实现结果的最佳方法。我正在考虑优化我的代码。任何更好的选择的建议将不胜感激。 sub是可以为空的子类别。

[AllowAnonymous]
    public ActionResult _relatedgrps(string cat, string sub)
    {
         if (!string.IsNullOrWhiteSpace(sub)){
            var pgs = db.Pages
            .Where(u=>u.MetaNoSearch==false)
            .Where(u => u.PaOk == true && u.Category.Name == cat &&   u.SubCategory.CatName == sub) 
            .OrderByDescending(u => u.PaCreatedOn);
        return PartialView(pgs.ToList());

         }else{
           var pgs = db.Pages
            .Where(u=>u.MetaNoSearch==false)
            .Where(u => u.PaOk == true && u.Category.Name == cat ) 
          .OrderByDescending(u => u.PaCreatedOn);   
        return PartialView(pgs.ToList());

    }}

3 个答案:

答案 0 :(得分:2)

Linq IEnumerables可以是附加的,只有在第一次枚举时才会执行查询(比如调用.ToList())。所以你应该能够做到这样的事情:

var pgs = db.Pages
    .Where(u => u.MetaNoSearch == false &&
           u.PaOk == true &&
           u.Category.Name == cat);

if (!string.IsNullOrWhiteSpace(sub))
{
    pgs = pgs.Where(u => u.SubCategory.CatName == sub);
}

return PartialView(pgs.OrderByDescending(u => u.PaCreatedOn).ToList());

答案 1 :(得分:0)

@ user3021830 - 小心String.IsNullOrWhitespace,你不能在数据库查询中使用它。你可以做String.IsNullOrWhitespace(sub),但不能做String.IsNullOrWhitespace(u。*)。

我会避免查询中的任何条件,因为这可能会导致SQL中的case语句。

为了产生最好的SQL我会做这样的事情:

var pgs = db.Pages.Where(u => u.MetaNoSearch == false)
                    .Where(u => u.PaOk == true)
                    .Where(u => u.Category.Name == cat);

if (!string.IsNullOrWhiteSpace(sub))
{
    pgs = pgs.Where(u => u.SubCategory.CatName == sub);   
}

var result = pgs.OrderByDescending(u => u.PaCreatedOn).ToList();

答案 2 :(得分:0)

创建一个对象来查询它。为了改进它,你也可以删除它的布尔比较,因为它们是条件。

var query = db.Pages.Where(u => !u.MetaNoSearch && u.PaOk && u.Category.Name == cat);

if (!string.IsNullOrWhiteSpace(sub))
    query = query.Where(u => u.SubCategory.CatName == sub);

query = query.OrderByDescending(u => u.PaCreatedOn);

return PartialView(query.ToList());