2015-02-18 2 views
0

У меня есть код ниже, который работает, но я не чувствую, что это лучший способ добиться результата. Я ищу оптимизацию своего кода. Любые предложения лучшего варианта будут оценены. sub - подкатегория, которая является нулевой.MVC4 Linq Query Optimization

[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()); 

    }} 
+1

Это форматирование ужасно читать –

ответ

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()); 
+0

большое спасибо – Diin

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()); 
+0

спасибо и => u.paOk должен быть u.PaOk еще он дает ошибку – Diin

0

@ user3021830 - будьте осторожны с String.IsNullOrWhitespace, вы не можете использовать это в запросе к базе данных. Вы можете сделать String.IsNullOrWhitespace (sub), но не String.IsNullOrWhitespace (u. *).

Я бы избежал любых условий в запросе, потому что это, скорее всего, приведет к выражению case в SQL.

Для получения наилучшего 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(); 
+0

@Paul Abbott - блин, бить меня к нему! – acarter