在Dynamic LINQ to Entities中使用DateTime

时间:2011-02-09 20:08:52

标签: c# linq visual-studio-2010 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的内容。

4 个答案:

答案 0 :(得分:12)

我最近开始在项目中使用动态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示例等表达式。

答案 1 :(得分:2)

如果您的查询通常仅按日期方面进行搜索,则另一种方法(如果SQL Server数据库可用)将以日期列类型冗余地存储日期时间列的截断版本。见http://msdn.microsoft.com/en-us/library/bb630352.aspx)。

您的所有查询都可以更好地执行,因为没有必要的转换,不太容易出现开发人员错误。并且它们在普通的旧SQL中也更容易查询。

然后,您的EF查询将在SQL Server日期列上查询

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是一个列出映射到sql函数的EF4函数的链接

Conceptual Model Canonical to SQL Server Functions Mapping