在单个语句中正确使用Select()和Where()

时间:2016-12-16 00:06:29

标签: c# linq select where

我试图在控制器中编写一个类似于我在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识别相同的变量?

1 个答案:

答案 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(),
   //...
  };