我有一个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子句中是不允许的?
谢谢你的时间...
在这种情况下,你可能想使用使用从方法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参数。
尝试这个:
myQry.Where(x => x.FirstName.Contains(strName) &&
x.BirthDt.Date == searchDt.Date).ToList()
请注意,对于上述工作,既BirthDt
和searchDt
必须是有效的DateTime值。 你现在仅比较DateTime值丢弃时间部分的日期部分。
我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没有为你实现。
什么操作都支持依赖于ORM框架,(NHibernate的,EF等),但基本上你可以考虑,如果你使用的是不具有文字转换为SQL它的方法很可能不会得到支持。
这就是为什么运营商==
是支持,但不是DateTime.Compare
方法,或运营商-
中DateTime
不支持,因为它并没有一个明确的翻译。
我们要永远坚持最简单的操作和避免方法,如果还是失败,你将不得不围绕谷歌如果具体方法是通过你的ORM支持。