7

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

var myQry = from .....

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

我试过这个编译并运行,但没有正常工作

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

然后我尝试了这个,它抛出了一个异常“DbArithmeticExpression arguments must have a numeric common type”

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

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

谢谢你的时间...

4

4 回答 4

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

于 2012-04-10T18:32:37.060 回答
3

尝试这个:

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

请注意,要使上述内容起作用,两者BirthDt和都searchDt必须是有效的 DateTime 值。您现在只比较 DateTime 值的 Date 部分,而忽略 Time 部分。

于 2012-04-10T17:23:19.817 回答
1

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

这就是为什么==支持运算符但不支持DateTime.Compare方法,或者不支持运算符-inDateTime因为它没有明确的翻译。

始终尝试坚持使用最简单的运算符并避免使用方法,如果仍然失败,如果您的 ORM 支持该特定方法,您将不得不谷歌搜索。

于 2012-04-10T17:37:47.883 回答
1

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

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

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

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

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

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

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

于 2012-04-10T17:52:52.417 回答