我试图在控制器中编写一个类似于我在SQL存储过程中的查询:
Select * FROM TableName Where aDate >= beginDate and aDate <= endDate
在我的控制器中,我声明了2个变量,它们将从我的视图文件中获取输入值:
DateTime? startDate = input.BeginDateInput;
DateTime? endDate = input.EndDateInput;
和变量q从db
获取值var q = db.tblName.AsQueryable();
目前,我有一个基于选择的所有值的表,如下所示:
var data = q.Select(
p =>
new
{
//...
WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(),
//...
});
当我尝试在
末尾添加.Where()时Select(...).Where(DateTime.Compare(Convert.ToDateTime(WarrantyExpDate), (DateTime)startDate)>0)
(缩短时间),我收到错误WarrantyExpDate was not in the current context
。在进行了一些研究之后,我尝试从that thread重新创建交换select和where的建议,但它返回了相同的问题。
任何人都可以指出我正确的方向我做错了吗?如何同时选择Select和Where识别相同的变量?
答案 0 :(得分:3)
正如BJ所指出的,如果您使用lambda语法,则需要为Where方法提供lambda表达式。这样的事情可能会奏效:
var data = q
.Where(p => p.WarrantyExpDate < startDate)
.Select(
p =>
new
{
//...
WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(),
//...
});
请注意,我首先放置Where
子句。这允许您对原始数据执行查询,而不是将其转换为字符串并返回。这通常是,但并非总是如此,更令人满意。有时,您的Select会为获取特定信息做很多工作,并且您不希望在Where子句中重复该逻辑。关于LINQ的好处是你可以选择最简单的方法。
您也可以考虑使用查询语法;它最终编译成几乎相同的东西,但是当你遇到大问题时看起来好一些。
var data =
from p in q
where p.WarrantyExpDate < startDate
select new
{
//...
WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(),
//...
};