在集合的子集合中转换日期时间并在LINQ to SQL中使用它

时间:2012-08-15 20:28:30

标签: c# linq linq-to-sql

我有一个带有子集合的集合,其中一个是作为字符串存储在DB中的日期字段,格式为yyyymmdd(其中还包含一些随机内容,如“E”或20085等)。此日期也是集合中其中一个子集的一部分。此日期字段现在将用于搜索,因此我需要将其设置为在LINQ语句中使用它的实际日期。

我从那里了解到LINQ to SQL不支持它无法转换为SQL的语句,因此我无法插入一个返回正确转换日期的函数,而我还没有找到一个会转换的标准转换函数将字符串转换为有效的日期对象。

我也尝试过分层转换,虽然这闻起来很糟糕,例如:

search = from c in search 
         where c.Object.Any(p=> new DateTime(Convert.ToInt32(p.theDate, Substring(0,4))))... etc.

无论我在这里做了什么,我都收到了转换错误。

我的基本问题是:LINQ to SQL是否支持内联进行此类转换?另一个选择是更改数据模型或创建视图,但我宁愿看看是否有办法在代码中首先处理这个问题。我正在尝试做的事情如下:

search = from c in search
         where c.subcollection.Any(p=>p.theDate >= min) && c.subcollection.Any(p=>p.theDate <= max)
         select c;

其中min和max以日期值传递。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您希望使用LINQ比较日期,但SQL日期列是字符串值,请使用.CompareTo("2002-01-01") >= 0

这将翻译并返回与2002-01-01匹配或稍后发生的任何日期。不确定这如何与你的子集合一起使用,但作为一个例子:

search = from c in search 
     where c.stringDateColumn.CompareTo("2002-01-01") >= 0 
     select c;

编辑:我在一个表上做了一些测试,其中包含日期字符串,如“2002-09-04E”,“2004-04-01 34”,“20050604e”和“2005-06-01444”,结果确实返回基于格式为yyyy-mm-dd或yyyymmdd的字符串:

search = from c in search
     where c.subcollection.Any(p=>p.theDate.CompareTo(min) >= 0) && c.subcollection.Any(p=>p.theDate.CompareTo(max) <= 0)
     select c;

答案 1 :(得分:0)

SqlMethods类有一些静态辅助方法,可以通过LINQ to SQL进行翻译。其中大部分都与DateTime比较有关。我不确定您正在寻找哪种方法,但您应该能够在 documentation page for System.Data.Linq.SqlClient.SqlMethods 找到您想要的方法

或者,您可以创建用户定义的函数并处理SQL端的转换和比较问题。集成不需要使用FunctionAttribute来装饰相应的对象模型方法,(这表明LINQ-to-SQL应该如何处理该方法。以下是有关此过程的一些文档: