Создать новый метод расширения Linq SelectMany - PullRequest
0 голосов
/ 22 июля 2010

Я использую 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 как IQueriable. Мне также нужно выяснить, как сделать DefaultIfEmpty для результатов, чтобы учесть левое соединение.

Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 29 июля 2010

Это было неправильное определение.Фактическая ошибка при правильном определении: невозможно преобразовать лямбда-выражение в тип «System.Linq.IQueryable», поскольку оно не является типом делегата

0 голосов
/ 23 июля 2010

c.Orders является EntitySet.EntitySet не реализует IQueryable.Попробуйте c.Orders.AsQueryable()

...