我正在使用Linq.Dynamic。我已经为所有人添加了另一个SelectMany扩展,用于创建带有数据的新匿名对象。但是,我遇到了另一个我似乎无法解决的问题。
我希望扩展方法链接如下,但使用动态方法:
var customerandorderflat = db.Customers
.SelectMany(c => c.Orders.SelectMany(o => o.Order_Details,
(ord, orddetail) => new
{
OrderID = ord.OrderID,
UnitPrice = orddetail.UnitPrice
}).DefaultIfEmpty(),
(cus, ord) => new
{
CustomerId = cus.CustomerID,
CompanyName = cus.CompanyName,
OrderId = ord.OrderID == null ? -1 : ord.OrderID,
UnitPrice = ord.UnitPrice
});
理想情况下,我想将动态SelectMany链接如下:
db.Customers.SelectMany(c => c.Orders.SelectMany("Order_Details", "new(outer.OrderID, inner.UnitPrice)"), "new(outer.CustomerID, inner.OrderID)");
或那些影响的东西。问题是我无法获得匹配的签名。
我尝试了很多不同的选项来让它允许链接。但它只是不起作用。我在理想情况下会这样看:
public static IQueryable SelectMany(this IQueryable source, IQueryable innerExpression, string resultsSelector, params object[] values)
但是,它不承认c => c.Orders as IQueriable。我还需要弄清楚如何对结果执行DefaultIfEmpty以允许LEFT JOIN。
请帮忙。
答案 0 :(得分:0)
c.Orders
是一个EntitySet。 EntitySet不实现IQueryable。试试c.Orders.AsQueryable()
答案 1 :(得分:0)
这是错误的定义。正确定义时的实际错误:无法将lambda表达式转换为类型'System.Linq.IQueryable',因为它不是委托类型