c# – 在Dynamic LINQ to Entities中使用DateTime

前端之家收集整理的这篇文章主要介绍了c# – 在Dynamic LINQ to Entities中使用DateTime前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用LINQ to Entities来检索项目购买日期,如下所示:
where EntityFunctions.TruncateTime(order.PurchaseDate) == myPurchaseDate.date

这里的关键是DB列包含日期和时间,因此必须剥离比较的时间.这段代码工作正常.

现在,我想使用动态LINQ to Entities做同样的事情.我正在使用VS2010代码示例文件夹中的dynamic.cs.当我编码:

.where("EntityFunctions.TruncateTime(PurchaseDate) == @0",myPurchaseDate.date);

或者我的任何变体都会收到错误消息.我需要编写什么作为字符串值才能使其工作? (因为我可以在字符串中使用.StartsWith或.Contains,我希望有一些日期函数动态LINQ会识别).

我知道我可以创建动态LINQ查询作为日期范围,从概念上讲:

PurchaseDate >= myPurchaseDate@midnight and PurchaseDate <= myPurchaseDate+23:59:59

实际上,从sql Server的角度来看,日期范围可能更有效,但我想知道在动态LINQ到实体中是否存在类似TruncateTime或ToShortDate的内容.

解决方法

我最近开始在项目中使用动态linq,并且还希望在没有时间组件的情况下比较日期. Microsoft的动态linq C#示例代码(Dynamic.cs)支持一组固定的类型,而EntityFunctions不是其中之一.

但通过一些实验,我发现只需将EntityFunctions添加到预定义类型的数组中,就可以使用TruncateTime和其他EntityFunctions方法.

以下是Dynamic.cs预定义类型数组在我的项目中的样子:

static readonly Type[] predefinedTypes = {
    typeof(Object),typeof(Boolean),typeof(Char),typeof(String),typeof(SByte),typeof(Byte),typeof(Int16),typeof(UInt16),typeof(Int32),typeof(UInt32),typeof(Int64),typeof(UInt64),typeof(Single),typeof(Double),typeof(Decimal),typeof(DateTime),typeof(TimeSpan),typeof(Guid),typeof(Math),typeof(Convert),typeof(System.Data.Objects.EntityFunctions)             // JimM
};

使用这个修改过的Dynamic.cs文件,我可以创建动态linq查询,包括问题中的PurchaseDate示例等表达式.

猜你在找的C#相关文章