简体   繁体   English

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

[英]Linq query and returning DateTime field in a short date format

I have two tables in the database Order and OrderDetails. 我在数据库中有两个表Order和OrderDetails。 I am joing them in a Linq query but only pulling data from Orders table. 我在Linq查询中添加它们,但仅从Orders表中提取数据。 I also have a corresponding class - ABOrders: 我也有一个对应的类-ABOrders:

[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; }
    }

The issue is that OrderDate comes with date and time and I just need it as a string in ShortDate format. 问题是OrderDate带有日期和时间,我只需要它作为ShortDate格式的字符串即可。 Originally I have tried: 最初我尝试过:

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)
                         };

but that errored out, so I created a new class: 但这出错了,所以我创建了一个新类:

[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; }
    }

and tried the following Linq query: 并尝试了以下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)                 
                         });

And now I am getting error: 现在我得到了错误:

The entity types 'ABOrder' and 'CDOrder' cannot share table 'Order' because they are not in the same type hierarchy or do not have a valid one to one foreign key relationship with matching primary keys between them. 实体类型“ ABOrder”和“ CDOrder”不能共享表“ Order”,因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系且它们之间具有匹配的主键。

How can I accomplish what i want - retrieve all data from Order table but with data in short format? 如何完成我想要的-从“订单”表中检索所有数据,但使用短格式的数据?

PS I cannot make any adjustments when displaying data to the user, so i have to do that in my query 附言:向用户显示数据时,我无法进行任何调整,因此我必须在查询中进行调整

Solution no.1 - get from database exactly what you want: 解决方案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();

Solution no.2 - get from database List of Orders and perform in memory the Select statment: 解决方案2-从数据库“订单清单”中获取并在内存中执行“选择”语句:

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();

In first query I build the string date, because LINQ to Entities does not recognize the method .ToString() . 在第一个查询中,我建立字符串日期,因为LINQ to Entities无法识别方法.ToString()

In the second query I used .AsEnumerable() to get a List<Order> , then I performed in memory the select statment. 在第二个查询中,我使用.AsEnumerable()获取List<Order> ,然后在内存中执行了select语句。

In the backend a DateTime is a DateTime, its not a string. 在后端,DateTime是DateTime,而不是字符串。 So it makes no sense of trying to make the DB to return a ShortDate. 因此,尝试使数据库返回ShortDate没有任何意义。 Instead you can make another read only field 相反,您可以设置另一个只读字段

something like 就像是

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

Solved it by switching to anonymous type. 通过切换为匿名类型来解决。 Upvoted helpful answers and comments: starlight54 - removing table name alias form CDOrder, and Lucian Bumb for suggesting a.OrderDate.Month + "/" + a.OrderDate.Day + "/" + a.OrderDate.Year 推荐有用的答案和意见:starlight54-从CDOrder删除表名称别名,而Lucian Bumb建议a.OrderDate.Month + "/" + a.OrderDate.Day + "/" + a.OrderDate.Year

Below is what worked: 以下是有效的方法:

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             
                         });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM