我有一个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子句中不允许进行哪些操作?
感谢您的时间......
答案 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()
请注意,要使上述工作正常,BirthDt
和searchDt
都必须是有效的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为你所做的。