Не могу заставить Sum () работать в примере с Northwind - PullRequest
1 голос
/ 30 апреля 2010

Следующий код генерирует ошибку времени выполнения, и я понятия не имею, почему.

from o in Orders
group o by o.Employee into employeeOrders
select new {
    employeeOrders.Key.EmployeeID,
    employeeOrders.Key.FirstName,
    Orders = 
        from eord in employeeOrders
        orderby eord.OrderID
        select new {
            eord.OrderID,
            eord.OrderDate,
            OrderTotal=eord.OrderDetails.Sum (od => od.UnitPrice)
        }
}

Ошибка

Доступ к элементу 'System.Decimal UnitPrice' из LINQPad.User.OrderDetails не разрешен для типа LINQPad.User.Orders

Я также пробовал это в VS2010 со стандартным контекстом перетаскивания данных и тем же.

Заранее спасибо

1 Ответ

0 голосов
/ 03 мая 2010

Я не могу полностью объяснить это в данный момент (я не получаю нужную мне информацию от отладчика), но из того, что я видел в msdn и пробовал немного, одновременно, без let, EntitySet<OrderDetail>, представляющий свойство OrderDetail в Orders, не загружается (так как EntitySet используется для отложенной загрузки) и, следовательно, недоступен.

Параметр let сейчас напрямую вызывает EntitySet и, таким образом, включает запросы. Это также идет вместе с комментарием Х. Холтермана.

Я попытаюсь найти более изощренное объяснение.

редактировать

Разница между ними:

с пусть

    .Call System.Linq.Enumerable.Sum(
        ($<>h__TransparentIdentifier0.eord).Order_Details,
        .Lambda #Lambda6<System.Func`2[northwindtest.Order_Detail,System.Decimal]>))

(лямбда6 - это лямбда в сумме, $ <> h__TransparentIdentifier0.eord - это переменная, определенная let)

без сдачи

    .Call System.Linq.Enumerable.Sum(
        $eord.Order_Details,
        .Lambda #Lambda5<System.Func`2[northwindtest.Order_Detail,System.Decimal]>))

Помните, что это исключительно интерпретация. Let оценивает подзапрос над EntitySet, заполняя его данными (-> отложенная загрузка). Это позволяет нам использовать данные даже вне переменной, объявленной let (опять же, отложенная загрузка). Я понятия не имею, почему это так, потому что я не могу получить состояние EntitySet<OrderDetail> на разных этапах дерева Выражений.

Исключение вызывается этим кодом в System.Data.Linq.SqlClient.SqlMember.Expression.Set

if (!this.member.ReflectedType.IsAssignableFrom(value.ClrType) && !value.ClrType.IsAssignableFrom(this.member.ReflectedType))
{
    throw Error.MemberAccessIllegal(this.member, this.member.ReflectedType, value.ClrType);
}

после длинного ряда Expression Translations. Из этого я делаю вывод, что невозможно представить дерево выражений в sql без некоторого подзапроса. Почему он не делает это самостоятельно? Я понятия не имею. Я не думаю, что смогу пойти дальше, анализируя это, я не знаю, является ли это реальной причиной, возможно, попросите кого-нибудь в MS за более ясным (и, вероятно, правильным подмигиванием ) объяснением.

Надеюсь, я смогу хоть немного помочь. Fema

...