使用LINQ比较查询中的日期

我有一个Linq查询返回到var类型myQry

var myQry = from ..... 

这是一个很大的linq返回我需要进一步过滤的所有记录。 在我的一个if条件中,我有一个像这样运行的filter来检查日期。 我需要检查名称是否包含输入的名称,并确切地匹配生日。

我尝试了这个编译和运行,但没有正常工作

 myQry.Where(x => x.FirstName.Contains(strName) && DateTime.Compare( x.BirthDt, searchDt)>=0).ToList() 

然后我尝试了这个,它抛出exception“DbArithmeticExpression参数必须有一个数字公共类型”

 myQry.Where(x => x.FirstName.Contains(strName) && (x.BirthDt- searchDt).Days == 0).ToList(); 

对于我在查询中使用where子句时的这种情况,进行日期比较的最佳方法是什么? LinQ查询的where子句中不允许进行哪些操作?

谢谢你的时间…

在这种情况下,您可能希望使用SqlMethods类中的方法来使用SQL Server特定的函数。

您的第二个查询可以重写为

 myQry.Where(x => x.FirstName.Contains(strName) && SqlMethods.DateDiffDay(x.BirthDt, searchDt) == 0).ToList() 

这将被翻译成类似的东西

 SELECT ... FROM Table WHERE FirstName LIKE '@p0' AND DATEDIFF(Day, BirthDt, @p1) = @p2 

其中p0,p1和p2是参数。

试试这个:

 myQry.Where(x => x.FirstName.Contains(strName) && x.BirthDt.Date == searchDt.Date).ToList() 

请注意,要使上述工作正常, BirthDtsearchDt必须是有效的DateTime值。 您现在只比较丢弃Time部分的DateTime值的Date部分。

我同意Leniel Macaferi关于更新Where子句并比较日期而不是日期时间。 对于出生日期,通常出生时间无关紧要。 回答你的第二个问题

LinQ查询的where子句中不允许进行哪些操作?

Where()是一个适用于IEnumerableIQueryable的扩展方法。 我们可以通过点击F12来看看这里的源代码:

 public static IEnumerable Where(this IEnumerable source, Func predicate); 

支持的操作称为谓词。 谓词是一个委托,它接受TSource类型的参数并返回一个bool,告诉我们条件是否匹配。 这可以在上面第二个参数中的代码中看到: Func predicate

您可以将谓词定义为您想要的任何内容。 只要它返回一个bool并接受一个类型为TSource的参数。

这通常通过定义lambda表达式来实现,这是Leniel Macaferi为您所做的。

支持哪些操作取决于ORM框架(Nhibernate,EF等),但基本上您可以考虑如果您使用的方法没有对SQL的字面翻译,则很可能不支持它。

这就是为什么支持operator ==但不支持DateTime.Compare方法或运算符-DateTime中不支持,因为它没有明确的转换。

总是尽量坚持使用最简单的操作符并避免使用方法,如果仍然失败,那么如果您的ORM支持该特定方法,则必须使用Google。