【发布时间】:2017-08-02 08:23:54
【问题描述】:
我正在过滤 LINQ 中项目列表的结果,我已经看到了两种方法,想知道哪种(如果有的话)更好。一个是我在玩了Intellisense之后想出的方法,另一个来自ASP.NET MVC教程(found here)
我的方法
// GET: ProductVersions
public ActionResult Index(string productName)
{
var productVersions = db.ProductVersions.Include(p => p.LicenceVersion).Include(p => p.Product);
if (!string.IsNullOrEmpty(productName))
{
productVersions = productVersions.Where(s => s.Product.Name == productName);
}
return View(productVersions.ToList());
}
教程方法
public ActionResult Index(string movieGenre)
{
var GenreLst = new List<string>();
var GenreQry = from d in db.Movies
orderby d.Genre
select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);
var movies = from m in db.Movies
select m;
if (!string.IsNullOrEmpty(movieGenre))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
return View(movies);
}
我的问题
- 性能是否存在显着差异,尤其是第二个选项非常冗长时
- 使用我的方法是否有我遗漏的风格约定
- 使用第二种方法是否还有其他可能的优势
~编辑~
原来我需要 ViewBag 数据才能在前端填充下拉过滤器(更遗憾的是),所以我的实际代码如下:
// GET: ProductVersions
public ActionResult Index(string productName)
{
//Get list of product names to filter by
var ProductLst = new List<string>();
var ProductQry = from pv in db.ProductVersions
orderby pv.Product.Name
select pv.Product.Name;
ProductLst.AddRange(ProductQry.Distinct());
ViewBag.productName = new SelectList(ProductLst);
//Populate product versions
var productVersions = db.ProductVersions.Include(p => p.LicenceVersion).Include(p => p.Product);
//Filter by product name
if (!string.IsNullOrEmpty(productName))
{
productVersions = productVersions.Where(s => s.Product.Name == productName);
}
return View(productVersions.ToList());
}
【问题讨论】:
-
你问的是
from x in db.Something select x还是简单的db.Something.AsQueryable()? -
是的,还有 GenreLst 和 GenreQry 的好处。我知道在我的示例中我没有添加到 viewbag 中,但除此之外......
-
@JLewis 只是为 UI 的另一部分填充数据。如果您没有另一块 UI 来获取数据:那就太好了!
-
原来我确实需要 viewbag 数据来过滤下拉列表。 叹息
-
@J Lewis 看看我的回答。重构和惰性是重要的主题
标签: c# asp.net asp.net-mvc linq