使用LINQ比较查询中的日期

时间:2012-04-10 17:19:17

标签: c# .net linq-to-sql datetime comparison

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

var myQry = from .....

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

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

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子句中不允许进行哪些操作?

感谢您的时间......

4 个答案:

答案 0 :(得分:4)

在这种情况下,您可能希望使用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是参数。

答案 1 :(得分:3)

试试这个:

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

  

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

Where()是一种适用于IEnumerable<T>IQueryable<T>的扩展方法。我们可以通过点击Where上的F12来查看源代码:

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

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

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

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