【发布时间】:2015-01-10 23:48:12
【问题描述】:
设置
我有一个“Order”类和一个“OrderDetail”类。
Order 类有一个名为“OrderDetails”的 IQueryable 类型的属性。
我在每个类中都有一个名为“GetData”的方法,该方法返回它所在类的 IQueryable。
“GetData”方法是实体的包装器,用于将实体转换为更友好的 .NET 类/属性。
例如: OrderDetail 实体在数据库中有一个“PullDate”作为 Char(10),但我希望 OrderDetail 类有一个名为“PullDate”的属性,该属性在类中属于 DateTime 类型。
代码
public class Order
{
[Key]
public int ID { get; set; }
public IQueryable<OrderDetail> OrderDetails { get; set; }
public static IQueryable<Order> GetData()
{
IQueryable<Order> orders;
var db = new OrderEntities();
// NOTE: This code will work
try
{
var data =
(from O in db.Orders
where O.OrderID == 1
select new Order
{
ID = O.OrderID,
OrderDetails =
(from OD in db.OrderDetails
where OD.OrderID == O.OrderID
select new OrderDetail
{
ID = OD.OrderDetailID,
OrderID = OD.OrderID,
PullDate = OD.PullDate == "00000000" ?
(DateTime?)null : db.yyyyMMddToDate(OD.PullDate),
Description = OD.Desc
})
});
orders = data.AsQueryable();
var orderList = orders.ToList();
}
catch (Exception ex)
{
throw;
}
// NOTE: This code will NOT work
try
{
var data = (from O in db.Orders
where O.OrderID == 1
select new Order
{
ID = O.OrderID,
OrderDetails = (from OD in OrderDetail.GetData(db)
where OD.OrderID == O.OrderID
select OD)
});
orders = data.AsQueryable();
var orderList = orders.ToList();
}
catch (Exception ex)
{
throw;
}
return orders;
}
}
public class OrderDetail
{
[Key]
public int ID { get; set; }
public int OrderID { get; set; }
public DateTime? PullDate { get; set; }
public string Description { get; set; }
public static IQueryable<OrderDetail> GetData(OrderEntities db)
{
IQueryable<OrderDetail> orderDetails;
var data = (from OD in db.OrderDetails
select new OrderDetail
{
ID = OD.OrderDetailID,
OrderID = OD.OrderID,
PullDate = OD.PullDate == "00000000" ?
(DateTime?)null : db.yyyyMMddToDate(OD.PullDate),
Description = OD.Desc
});
orderDetails = data.AsQueryable();
var orderList = orderDetails.ToList();
return orderDetails;
}
}
错误
LINQ to Entities 无法识别方法 'System.Linq.IQueryable`1[Models.OrderDetail] GetData(Models.OrderEntities)' 方法,并且该方法无法转换为存储表达式。
请求
我希望 Order.GetData 方法使用 LINQ 调用 OrderDetail.GetData 方法。
我需要在 Order.GetData 类中“加入”GetData 方法或“子选择”OrderDetail.GetData。
这两个类都在其 GetData 方法中查询 EntityFramework。
投影是一项要求。
我的目标是在我的 DTO 类中创建像“GetData”这样的“可重用”方法,这些方法将包含特定的 SQL/实体逻辑。
例如,我在我的 DTO 类中使用了很多自定义 SQL 函数,如“db.yyyyMMddToDate”,将实体转换为更对象/.NET 友好的东西,我不想每次都“重新输入”所有逻辑需要从实体中“加入/分选”数据。
在 LINQ to Objects 中,这与连接来自不同类的两个不同列表相同。
但似乎 LINQ to Entity 不知道如何从其他类中加入方法,即使该方法被标记为可查询。
我知道 LINQ to Entity 将“GetData”方法视为 SQL 函数,但我需要一种方法来告诉 LINQ to Entity 这些只是更多的实体,可以连接在一起以获得结果。
【问题讨论】:
标签: c# linq entity-framework