首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC4 Linq查询优化

MVC4 Linq查询优化
EN

Stack Overflow用户
提问于 2015-02-18 21:26:11
回答 3查看 69关注 0票数 0

我有下面的代码,它的工作,但我不觉得这是最好的方式来实现的结果。我正在优化我的代码。如有任何更好选择的建议,将不胜感激。子范畴是可为空的子范畴。

代码语言:javascript
复制
[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());

    }}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-18 21:51:34

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

代码语言:javascript
复制
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());
票数 0
EN

Stack Overflow用户

发布于 2015-02-18 21:39:52

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

代码语言:javascript
复制
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());
票数 2
EN

Stack Overflow用户

发布于 2015-02-18 21:47:05

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

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

要产生最好的SQL,我应该这样做:

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28594248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档