我正在重写现有的遗留系统,该系统使用存储过程来检索所需的数据。
新设计将具有正常的列排序和文本过滤功能,但我遇到了令我难过的东西。
我能够对检索到的数据执行LINQ查询,并获得我想要的结果,如下所示:
var customerIDParam = new SqlParameter("@customerID", 452);
var result =
db.Database.SqlQuery<InventoryDetail>("map_efs_InventoryDetail @customerID", customerIDParam).ToList();
// this works!
var finalResult1 = from s in result
.Where(s => s.cProductDescription.Contains("E"))
.OrderBy(s => s.cProductDescription)
select s;
return View(finalResult1.ToList());
我真的想动态地构建LINQ语句,但是如果失败,总是返回完整的查询
var customerIDParam = new SqlParameter("@customerID", 452);
var result =
db.Database.SqlQuery<InventoryDetail>("map_efs_InventoryDetail @customerID", customerIDParam).ToList();
// This does not work ???
var finalResult2 = from s in result select s;
finalResult2.OrderBy(s => s.cProductDescription);
finalResult2.Where(s => s.cProductDescription.Contains("E"));
return View(finalResult2.ToList());
如果有人可以提供帮助,我会很感激。
此致 标记
答案 0 :(得分:1)
OrderBy / Where / Etc是“纯”方法,它们将返回另一个IEnumerable,所以你的结果永远不会被排序或过滤,你需要分配新的操作(我说操作是因为IEnumerables有延迟执行),例如:
分配变量:
List<Customer> customers = context.Customers.ToList();
IEnumerable<Company> companies = customers.Select(e => e.Company);
IEnumerable<Company> companiesFiltered = companies.Where(e => e.Active);
IOrderedEnumerable<Company> companiesOrdered = companiesFiltered.OrderBy(e => e.Id);
companiesFiltered = companiesOrdered.ThenBy(e => e.Code); // because the variable and result are the same type we can do this
使用返回值:
var finalResult2 = result.Select(r => r.s)
.Where(s => s.cProductDescription.Contains("E"))
.OrderBy(s => s.cProductDescription);
因为每个操作都返回另一个IEnumrable,所以我们可以像这样流畅地“链接调用”。请记住,当您调用ToList()时会发生实际执行。
答案 1 :(得分:-1)
我发现了自己的错误。
var finalResult2 = from s in result select s;
finalResult2 = finalResult2.OrderBy(s => s.cProductDescription);
finalResult2 = finalResult2.Where(s => s.cProductDescription.Contains("E"));
return View(finalResult2.ToList());