Я не могу полностью объяснить это в данный момент (я не получаю нужную мне информацию от отладчика), но из того, что я видел в 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