【问题标题】:Proper usage of Select() and Where() in a single statement在单个语句中正确使用 Select() 和 Where()
【发布时间】:2017-05-01 17:11:18
【问题描述】:

我正在尝试在控制器中编写一个类似于我在 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 的表,如下所示:

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 都识别同一个变量?

【问题讨论】:

  • Where 需要委托,通常采用 lambda 表达式的形式。在你的情况下,更像.Where(n =&gt; DateTime.Compare(Convert.ToDateTime(n.WarrantyExpDate)...
  • @BJMyers 我执行了建议的快速修复,它似乎消除了错误。感觉恶心肯定会让你忘记这些基础知识。明天测试后我会告诉你结果。

标签: c# linq select where


【解决方案1】:

正如 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(),
   //...
  };

【讨论】:

  • 我要走了,但我肯定会在明天早上第一时间尝试你的两个建议,谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-07-26
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2019-03-13
相关资源
最近更新 更多