Linq - 日期之间查询

时间:2015-05-14 09:24:21

标签: c# sql-server linq datetime

我正在尝试将以下sql查询转换为linq查询,但是我一直遇到错误 -

  

运营商'< ='不能应用于' string'类型的操作数和' System.DateTime'。

SQL查询:

select top 3 Deal, [property], [event], [Date] from [dbo]. [Database_CRE_Events] 
where (convert(datetime,[Date],103) between '01-May-2015' and '15-May-2015')  and [property] is not NULL 
order by convert(datetime,[Date],103) desc

我相信这种情况正在发生,因为c.Date是来自实体数据库的字符串字段。我已经尝试将日期值转换为字符串和日期时间以使以下工作,但我不断收到操作数错误。

LINQ查询:

        DateTime dat = DateTime.Now.AddDays(-10);
        string preWeek = dat.ToString("dd-MMM-yyyy");

        DateTime dtt = DateTime.Now;
        string today = dat.ToString("dd-MMM-yyyy");

        var data = db.Database_CRE_Events.Where(c => c.Date <= Convert.ToDateTime(preWeek) && c.property != null)
                      .Select(x => new Loan() { Name = x.Deal, loan = x.property, evnt = x.Event })
                      .ToList().Take(3);
        return data;

是否可以将原始sql查询转换为linq查询,因为c.Date是字符串参数?

感谢您提供进一步的帮助。

1 个答案:

答案 0 :(得分:6)

问题在于你无缘无故地将字符串引入混音中。除非您 DateTime转换为字符串,否则请不要这样做。

您的查询应该像以下一样简单:

DateTime preWeek = DateTime.Today.AddDays(-10);

var data = db.Database_CRE_Events
    .Where(c => c.Date <= preWeek && c.property != null)
    .Select(x => new Loan() { Name = x.Deal, loan = x.property, evnt = x.Event })
    .ToList()
    .Take(3);
return data;

如果c.Date实际上是string,则应修复数据库,使其不是字符串。它的意思是约会,所以把它当作约会对象吧!如果您绝对 将其保留为字符串,则至少应使用可排序的格式,例如yyyy-MM-dd。那时你可以使用CompareTo - 但它太可怕了:(

如果格式为dd-MMM-yyyy(听起来像),您可以尝试在LINQ查询中执行解析,仍然传入DateTime但解析每个值数据库:

.Where(c =>
   DateTime.ParseExact(c.Date, "dd-MMM-yyyy", CultureInfo.InvariantCulture) <= preWeek
   && c.property != null)

......但如果失败,我不会感到惊讶。您可能希望在SQL中添加一个视图,该视图提供更合适的数据版本。从根本上说,如果你必须使用一个破坏的模式(在这种情况下使用错误的类型做出关于如何格式化该类型中的数据的糟糕决定)那么你应该期待痛苦。将这种痛苦传递给管理者,以便优先考虑更改架构......

注意:

  • 您正在获取所有数据,然后只获取前三个元素。这是一个坏主意。在解决下一个项目后,将呼叫切换到ToListTake ......
  • &#34;前三个元素&#34;只对订购有意义。使用OrderBy指定订购
  • 您目前没有使用today,因此我将其删除了
  • 如果您只对某个日期感兴趣,请使用DateTime.Today
  • 您应该仔细考虑数据库和调用代码中的时区。目前这是使用系统默认时区 - 这是你想要的吗?