在Dynamic LINQ to Entities中使用DateTime

use*_*342 7 c# linq datetime visual-studio-2010

我正在使用LINQ to Entities检索项目购买日期,如下所示:

where EntityFunctions.TruncateTime(order.PurchaseDate) == myPurchaseDate.date
Run Code Online (Sandbox Code Playgroud)

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

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

.where("EntityFunctions.TruncateTime(PurchaseDate) == @0", myPurchaseDate.date);
Run Code Online (Sandbox Code Playgroud)

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

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

PurchaseDate >= myPurchaseDate@midnight and PurchaseDate <= myPurchaseDate+23:59:59
Run Code Online (Sandbox Code Playgroud)

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

小智 12

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

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

这是Dynamic.cs predefinedTypess数组在我的项目中的样子:

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
};
Run Code Online (Sandbox Code Playgroud)

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


Don*_*yrd 0

我认为您会想要使用日期范围,以便在需要时可以利用服务器上的索引。如果您的 select 语句基于计算字段,则需要扫描表以查找每个查询。