日期间查询

本文关键字:查询 日期 | 更新日期: 2023-09-27 17:49:02

我试图将以下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是来自实体数据库的字符串字段。我已经尝试将日期值转换为字符串和datetime以使以下工作,但我一直得到一个操作数错误。

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是字符串参数?

谢谢你的进一步帮助。

日期间查询

问题是您毫无理由地将字符串引入到混合中。除非你转换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的调用…
  • "前三个元素"只对排序有意义。使用OrderBy指定排序
  • 你目前没有使用today,所以我删除了它
  • 如果你只对约会感兴趣,使用DateTime.Today
  • 您应该仔细考虑时区,无论是在数据库中还是在调用代码中。这是当前使用系统默认时区-这是您想要的吗?