我正在尝试将以下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
是字符串参数?
感谢您提供进一步的帮助。
答案 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中添加一个视图,该视图提供更合适的数据版本。从根本上说,如果你必须使用一个破坏的模式(在这种情况下使用错误的类型和做出关于如何格式化该类型中的数据的糟糕决定)那么你应该期待痛苦。将这种痛苦传递给管理者,以便优先考虑更改架构......
注意:
ToList
和Take
...... OrderBy
指定订购today
,因此我将其删除了DateTime.Today