1

我正在使用 Linq.Dynamic。我已经为 all 添加了另一个 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。

请帮忙。

4

2 回答 2

0

c.Orders是一个实体集。EntitySet 没有实现 IQueryable。尝试c.Orders.AsQueryable()

于 2010-07-22T20:36:20.647 回答
0

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

于 2010-07-28T22:08:42.457 回答