Linq查询并以短日期格式返回DateTime字段

本文关键字:格式 返回 DateTime 字段 日期 查询 Linq | 更新日期: 2023-09-27 18:02:09

我在数据库中有两个表Order和OrderDetails。我在Linq查询中加入它们,但只从订单表中提取数据。我也有一个相应的类- borderders:

[Table("[Order]")]
public partial class ABOrder
    {
        [Key]
        public int OrderID { get; set; }
        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public DateTime OrderDate { get; set; }
    }

问题是OrderDate带有日期和时间,我只需要它作为ShortDate格式的字符串。原来我试过:

var result = (from a in ctx.Order
                         join b in ctx.OrderDetails on a.OrderId Equals b.OrderId
                         where a.Field1.Equals(id) && b.Field1.Contains("TEST")
                         select new myClass.ABOrder
                         {
                             OrderId = a.OrderId,
                             Field1 = a.Field1,
                             Field2=a.Field2, 
                             OrderDate = String.Format("MM/dd/yyyy", a.OrderDate)
                         };

但是这个错误了,所以我创建了一个新类:

[Table("[Order]")]
public partial class CDOrder
    {
        [Key]
        public int OrderID { get; set; }
        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string OrderDate { get; set; }
    }

并尝试了以下Linq查询:

var result = (from a in ctx.Order
                         join b in ctx.OrderDetails on a.OrderId Equals b.OrderId
                         where a.Field1.Equals(id) && b.Field1.Contains("TEST")
                         select new myClass.ABOrder
                         {
                             OrderId = a.OrderId,
                             Field1 = a.Field1,
                             Field2=a.Field2, 
                             OrderDate = a.OrderDate
                         }).AsEnumerable().Select(x => new myClass.CDOrder
                         {
                             OrderId = x.OrderId,
                             Field1 = x.Field1,
                             Field2=x.Field2, 
                             OrderDate = String.Format("MM/dd/yyyy", x.OrderDate)                 
                         });

现在我得到错误:

实体类型'ABOrder'和'CDOrder'不能共享表'Order',因为它们不在相同的类型层次结构中,或者它们之间没有有效的一对一外键关系,并且它们之间没有匹配的主键。

我怎么能完成我想要什么-检索所有数据从订单表,但在短格式的数据?

注:在向用户显示数据时,我无法进行任何调整,因此我必须在查询

Linq查询并以短日期格式返回DateTime字段

中进行调整。

解决方案no。1 -从数据库中得到你想要的:

var result=ctx.Order.Where(a=>a.Field1.Equals(id))
    .Join(ctx.OrderDetails.Where(b=>b.Field1.Contains("TEST")),
     x=>x.OrderId ,y=>y.OrderId ,(x,y)=>new CDOrder
    {
     OrderId = x.OrderId,
     Field1 = x.Field1,
     Field2=x.Field2, 
     OrderDate = x.OrderDate.Month+"/"+x.OrderDate.Day+"/"+x.OrderDate.Year
    }).ToList();

解决方案。2 -从数据库中获取订单列表并在内存中执行Select语句:

var result=ctx.Order.Where(a=>a.Field1.Equals(id))
    .Join(ctx.OrderDetails.Where(b=>b.Field1.Contains("TEST")),
     x=>x.OrderId ,y=>y.OrderId ,(x,y)=>x)
.AsEnumerable()
.Select(x=>new CDOrder
    {
     OrderId = x.OrderId,
     Field1 = x.Field1,
     Field2=x.Field2, 
     OrderDate = x.OrderDate.ToString("MM/dd/yyyy")
    }).ToList();

在第一个查询中,我构建字符串日期,因为LINQ到实体不识别方法.ToString()

在第二个查询中,我使用.AsEnumerable()来获取List<Order>,然后在内存中执行select语句。

在后端DateTime是一个DateTime,它不是一个字符串。因此,试图让DB返回ShortDate是没有意义的。相反,您可以创建另一个只读字段

之类的
public string OrderDateDate
{
    get
    {
        return OrderDate.ToString("MM/dd/yyyy");
    }
}

通过切换为匿名类型解决。支持有用的回答和评论:starlight54 -从CDOrder中删除表名别名,以及Lucian Bumb建议a.OrderDate.Month + "/" + a.OrderDate.Day + "/" + a.OrderDate.Year

如下所示:

var result = (from a in ctx.Orders
                         join b in ctx.OrderDetails on a.OrderId Equals b.OrderId
                         where a.Field1.Equals(id) && b.Field1.Contains("TEST")
                         select new 
                         {
                             OrderId = a.OrderId,
                             Field1 = a.Field1,
                             Field2=a.Field2, 
                             OrderDate = a.OrderDate.Month + "/" + a.OrderDate.Day + "/" + a.OrderDate.Year
                         }).AsEnumerable().Select(x => new myClass.CDOrder
                         {
                             OrderId = x.OrderId,
                             Field1 = x.Field1,
                             Field2=x.Field2, 
                             OrderDate = x.OrderDate             
                         });