2010-07-22 108 views
0

我正在使用Linq.Dynamic。我已经向所有人添加了另一个SelectMany扩展,以便使用这些数据创建一个新的匿名对象。但是,我遇到了另一个我似乎无法解决的问题。创建新的Linq 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作为IQueriable。我还需要弄清楚如何对结果执行DefaultIfEmpty以允许LEFT JOIN。

请帮忙。

回答

0

c.Orders是一个EntitySet。 EntitySet不实现IQueryable。尝试c.Orders.AsQueryable()

+0

c => c.Orders怎么办?我试图做c => c.Orders.AsQueryable() 错误: 无法将lambda表达式转换为类型'string',因为它不是委托类型 – Dan 2010-07-22 22:28:47

+0

它得到了错误的定义。右键定义时的实际错误: 无法将lambda表达式转换为类型'System.Linq.IQueryable',因为它不是委托类型 – Dan 2010-07-22 22:41:11

+0

您是否找到了解决方案?我有完全相同的问题... – Licentia 2017-12-25 23:13:12

0

它得到了错误的定义。右键定义时的实际错误:无法将lambda表达式转换为类型'System.Linq.IQueryable',因为它不是委托类型