我有2个实体,我想在数据库中联盟:
public class Event
{
[Required]
[StringLength(255)]
public string Name { get; set; }
public DateTime Datum { get; set; }
}
public class ClosingDay
{
[Required]
[StringLength(50)]
public string Name { get; set; }
[Column(TypeName = "date")]
public DateTime DatumVon { get; set; }
}
正如你所看到的,这两列略有不同,Datum是DateTime,datumVon是日期类型。这使得它们在数据库中看起来略有不同,因为项目是代码优先的方法。
所以现在我想创建一个linq语句来连接这两个列(在数据库中,我不能在内存中这样做):
var tmp =
(
from s in _context.ClosingDay
select new CalendarDTO
{
Datum = Convert.ToDateTime(s.DatumVon),
Name = Convert.ToString(s.Name)
}
).Concat(
from t in _context.Event
select new CalendarDTO
{
Datum = Convert.ToDateTime(t.Datum),
Name = Convert.ToString(t.Name)
}
);
其中CalendarDTO看起来像这样:
public class CalendarDTO
{
public DateTime DatumVon { get; set; }
public string Name { get; set; }
}
如果我只在CalendarDTO中设置Name,它就可以工作,但是日期字段的联合不起作用,尽管有convert.toDateTime
我一直收到错误
Unable to translate set operation after client projection has been applied. Consider moving the set operation before the last 'Select' call.
你有没有什么办法让它工作,而不做工会在内存中?
2条答案
按热度按时间vxbzzdmp1#
LINQ to Entities无法将
Convert.ToDateTime
转换为SQL代码。但您可以使用DbFunctions.TruncateTime
:当用作LINQ to Entities查询的一部分时,此方法调用规范TruncateTime EDM函数以返回时间部分已清除的给定日期。
注意,
DateTime
本身可以包含date
和datetime
类型的数据。也就是说,EF自动将date
类型Map到DateTime
对象,并将时间部分设置为00:00:00
。wztqucjr2#
幸运的是,我找到了这个奇怪的“解决方案”:
我不推荐它(因为我相信最终在EF更新后它将不再工作),但它现在工作。