我在数据库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表中检索所有数据,但是使用短格式的数据?
P.S。在向用户显示数据时我无法进行任何调整,因此我必须在查询中执行此操作
答案 0 :(得分: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 - 从数据库获取订单列表并在内存中执行选择参数:
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>
,然后我在内存中执行了选择语句。
答案 1 :(得分:0)
在后端,DateTime是DateTime,它不是字符串。因此,尝试让DB返回ShortDate是没有意义的。相反,你可以创建另一个只读字段
类似
public string OrderDateDate
{
get
{
return OrderDate.ToString("MM/dd/yyyy");
}
}