MVC SqlQuery和第二种

时间:2015-02-12 21:40:38

标签: c# asp.net-mvc linq

我正在重写现有的遗留系统,该系统使用存储过程来检索所需的数据。

新设计将具有正常的列排序和文本过滤功能,但我遇到了令我难过的东西。

我能够对检索到的数据执行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());

如果有人可以提供帮助,我会很感激。

此致 标记

2 个答案:

答案 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());