0

我有一个包含子集合的集合,其中一个是作为字符串存储在数据库中的日期字段,格式为 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 在日期值中传递。

谢谢!

4

2 回答 2

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;
于 2012-08-16T02:17:46.717 回答
0

该类SqlMethods具有一些可由 LINQ 转换为 SQL 的静态辅助方法。其中大部分与 DateTime 比较有关。我不确定您正在寻找哪种方法,但您应该能够在System.Data.Linq.SqlClient.SqlMethods 的文档页面上找到您想要的方法

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

于 2012-08-16T02:27:41.623 回答