日期间查询
本文关键字:查询 日期 | 更新日期: 2023-09-27 17:49:02
我试图将以下sql查询转换为linq查询,但是我一直遇到错误-
SQL查询:操作符'<='不能应用于'string'和'System.DateTime'类型的操作数。
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中添加一个视图,以提供更合适的数据版本。从根本上说,如果您必须处理一个损坏的模式(在本例中使用了错误的类型,并且对如何格式化该类型中的数据做出了错误的决定),那么您应该预料到痛苦。将这种痛苦传递给管理人员,以便优先考虑更改模式…
指出:
- 您正在获取所有数据,然后只获取前三个元素。这是个坏主意。在解决下一个项目后,切换到
ToList
和Take
的调用… - "前三个元素"只对排序有意义。使用
OrderBy
指定排序 - 你目前没有使用
today
,所以我删除了它 - 如果你只对约会感兴趣,使用
DateTime.Today
- 您应该仔细考虑时区,无论是在数据库中还是在调用代码中。这是当前使用系统默认时区-这是您想要的吗?