在单个语句中正确使用 Select() 和 Where()
Proper usage of Select() and Where() in a single statement
我正在尝试在控制器中编写一个类似于我在 SQL 存储过程中的查询:
Select * FROM TableName Where aDate >= beginDate and aDate <= endDate
在我的控制器中,我声明了 2 个变量,它们将从我的视图文件中获取输入值:
DateTime? startDate = input.BeginDateInput;
DateTime? endDate = input.EndDateInput;
和从 db
获取值的变量 q
var q = db.tblName.AsQueryable();
目前,我有一个基于 Select 的所有值的 table,如下所示:
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 识别同一个变量?
正如 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(),
//...
};
我正在尝试在控制器中编写一个类似于我在 SQL 存储过程中的查询:
Select * FROM TableName Where aDate >= beginDate and aDate <= endDate
在我的控制器中,我声明了 2 个变量,它们将从我的视图文件中获取输入值:
DateTime? startDate = input.BeginDateInput;
DateTime? endDate = input.EndDateInput;
和从 db
获取值的变量 qvar q = db.tblName.AsQueryable();
目前,我有一个基于 Select 的所有值的 table,如下所示:
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 识别同一个变量?
正如 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(),
//...
};