Linq:包含date和datetime列的两个表的联合

z9ju0rcb  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(184)

我有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.

你有没有什么办法让它工作,而不做工会在内存中?

vxbzzdmp

vxbzzdmp1#

LINQ to Entities无法将Convert.ToDateTime转换为SQL代码。但您可以使用DbFunctions.TruncateTime

using Microsoft.EntityFrameworkCore;

var tmp =
(
    from s in _context.ClosingDay
    select new CalendarDTO
    {
        DatumVon = s.DatumVon,
        Name = s.Name
    }
).Concat(
    from t in _context.Event
    select new CalendarDTO
    {
        DatumVon = DbFunctions.TruncateTime(t.Datum),
        Name = t.Name
    }
);

当用作LINQ to Entities查询的一部分时,此方法调用规范TruncateTime EDM函数以返回时间部分已清除的给定日期。
注意,DateTime本身可以包含datedatetime类型的数据。也就是说,EF自动将date类型Map到DateTime对象,并将时间部分设置为00:00:00

wztqucjr

wztqucjr2#

幸运的是,我找到了这个奇怪的“解决方案”:

var tmp =
(
    from s in _context.ClosingDay
    select new CalendarDTO
    {
        DatumVon = (DateTime)(object)s.DatumVon,
        Name = s.Name
    }
).Concat(
    from t in _context.Event
    select new CalendarDTO
    {
        DatumVon = (DateTime)(object)t.Datum,
        Name = t.Name
    }
);

我不推荐它(因为我相信最终在EF更新后它将不再工作),但它现在工作。

相关问题