在查询中比较日期使用LINQ(Comparing dates in query using LINQ

2019-09-16 10:52发布

我有一个LINQ查询,返回到VAR型myQry

var myQry = from .....

这是一个大的LINQ返回我需要进一步筛选的所有记录。 在我如果条件一个我有一个运行像这样的检查对最新的过滤器。 我需要检查,如果名称中包含输入的名字和出生日期完全一致。

我想这里面编译和运行,但没有正常工作

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

然后,我想这这给了抛出异常“DbArithmeticExpression参数必须有一个数字常见的类型”

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

对于这样一种情况,当我使用where子句对我的询问,什么是做一个日期比较的最好方法? 什么样的操作的LINQ查询的WHERE子句中是不允许的?

谢谢你的时间...

Answer 1:

在这种情况下,你可能想使用使用从方法SQL Server特定功能SqlMethods类。

你的第二个查询可以被改写为

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参数。



Answer 2:

尝试这个:

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

请注意,对于上述工作,既BirthDtsearchDt必须是有效的DateTime值。 你现在仅比较DateTime值丢弃时间部分的日期部分。



Answer 3:

我Leniel Macaferi同意关于更新的WHERE子句和比较日期,而不是日期时间。 对于一个生日,通常在出生的时候是不相关的。 要回答你的第二个问题

什么样的操作的LINQ查询的WHERE子句中是不允许的?

Where()是一个扩展方法,其工作原理上IEnumerable<T>IQueryable<T> 我们只需按F12看到这Where来看看源代码:

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

支持的操作被称为谓词。 谓词是一个委托,它需要一个类型TSource的参数,并返回一个布尔告诉我们的条件是否匹配与否。 这可以在代码中的第二个参数中可以看出以上: Func<TSource, bool> predicate

您可以定义谓词是任何你想要的。 只要它返回一个布尔值并接受类TSource 1个参数。

这通常是通过定义一个lambda表达式,这是Leniel Macaferi没有为你实现。



Answer 4:

什么操作都支持依赖于ORM框架,(NHibernate的,EF等),但基本上你可以考虑,如果你使用的是不具有文字转换为SQL它的方法很可能不会得到支持。

这就是为什么运营商==是支持,但不是DateTime.Compare方法,或运营商-DateTime不支持,因为它并没有一个明确的翻译。

我们要永远坚持最简单的操作和避免方法,如果还是失败,你将不得不围绕谷歌如果具体方法是通过你的ORM支持。



文章来源: Comparing dates in query using LINQ