【问题标题】:Linq query and returning DateTime field in a short date formatLinq查询并以短日期格式返回DateTime字段
【发布时间】:2016-08-12 21:05:58
【问题描述】:

我在数据库 Order 和 OrderDetails 中有两个表。我将它们加入到 Linq 查询中,但只从 Orders 表中提取数据。我也有相应的类——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; }
    }

问题是 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”,因为它们不在同一个类型层次结构中,或者它们之间没有有效的一对一外键关系和匹配的主键。

我怎样才能完成我想要的 - 从 Order 表中检索所有数据,但使用短格式的数据?

附:在向用户显示数据时我无法进行任何调整,所以我必须在我的查询中这样做

【问题讨论】:

  • 您正在取回一个日期时间对象。当您真正想向用户显示它们时,只需调用 .ToString("MM/dd/yyyy")
  • 我最初尝试这样做,但就是这样,在向用户显示时我无法进行任何调整
  • 不只是从类CDOrder 中删除属性[Table("[Order]")] 可以解决上述情况下的问题,还是需要将其识别为数据库的一部分才能使该查询起作用?
  • 我试过了,得到一个新错误:无法在 LINQ to Entities 查询中构造实体或复杂类型“myCLass.DAL.ABOrder”

标签: c# linq asp.net-web-api


【解决方案1】:

解决方案 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 to Entities 无法识别方法 .ToString()

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

【讨论】:

  • 你的解决方案给了我一个错误The entity or complex type 'myCLass.DAL.CDOrder‌​' cannot be constructed in a LINQ to Entities query
  • @ElenaDBA,尝试从查询中删除CDOrder,然后只返回一个 Anonymus 类型,错误是否可能来自您的课程是部分的,如果您有任何问题,请告诉我错误!
  • 伙伴你能帮我解决这个问题吗:stackoverflow.com/questions/39275597/…
【解决方案2】:

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

类似

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

【讨论】:

    【解决方案3】:

    通过切换到匿名类型来解决它。推荐有用的答案和 cmets: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             
                             });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多