MVC4 Linq 查询优化
MVC4 Linq Query Optimisation
我有以下有效的代码,但我认为这不是实现结果的最佳方法。我正在考虑优化我的代码。任何更好的选择建议将不胜感激。 sub 是一个可以为 null 的子类别。
[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());
}}
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());
@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();
创建一个对象来查询它。要改进它,您还可以删除它的布尔比较,因为它们是条件。
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());
我有以下有效的代码,但我认为这不是实现结果的最佳方法。我正在考虑优化我的代码。任何更好的选择建议将不胜感激。 sub 是一个可以为 null 的子类别。
[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());
}}
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());
@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();
创建一个对象来查询它。要改进它,您还可以删除它的布尔比较,因为它们是条件。
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());