在单个语句中正确使用 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(),
   //...
  };