У меня есть следующий запрос с несколькими внутренними и внешними соединениями. Запрос создать новый класс, который не является частью структуры Entity, но класс, который содержит данные для отчета:NotSupportedException в запросе LINQ с внутренними и внешними соединениями
from T6340 in PayOrders
from T6351 in POrderAccPDocLines.Where(x=> T6340.Id == x.PaymentDocId)
from T6321 in PaymentDocLines.Where(x=> T6351.PaymentDocId == x.PaymentDocId &&
T6351.Line == x.Line)
from T6125 in ItemBillPDocLines.Where(x =>T6321.PaymentDocId == x.PaymentDocId &&
T6321.Line == x.LineId).DefaultIfEmpty(null)
from T6126 in ItemBillStockPDocs.Where(x => T6125.BillId== x.ItemBillId &&
T6125.PaymentDocId == x.PaymentDocId && T6125.LineId == x.PDocLineId &&
T6125.SplitNumber == x.PDocSplitNumber).DefaultIfEmpty(null)
from T6126_A in ItemBillStockPDocs.Where(x => T6125.BillId == x.ItemBillId &&
T6125.PaymentDocId == x.PaymentDocId && T6125.LineId == x.PDocLineId &&
T6125.SplitNumber == x.PDocSplitNumber).DefaultIfEmpty(null)
from T6201 in StockTransactions.Where(x => T6126.TransactionId == x.Id &&
T6126.TransactionSubId == x.SubId).DefaultIfEmpty(null)
where T6125.BillId == billId && T6321.PaymentDoc.Canceled == 0
group new
{
T6321,T6125,T6351,T6126_A,T6340,T6201
}
by new
{
T6321_PaymentDocId = T6321.PaymentDocId,
T6321.Line,
T6321.CurrencyId,
T6321.Amount,
T6125,
T6351.GLAccount,
T6351.PaymentOrderAmount,
T6321.PaymentDoc.ReferenceCode,
T6126_Quantity = T6126_A.Quantity,
T6126_A.TransactionId,
T6126_A.TransactionSubId,
T6351.PaymentOrderId,
T6340.PayCurrency,
T6126_A.TransactionSplitNumber
} into grouped
select new PaymentDataStore()
{
ItemBillPaymentDocLine = grouped.Key.T6125,
Currency = grouped.Key.CurrencyId,
Amount = grouped.Key.Amount,
PaymentDocumentId = grouped.Key.T6321_PaymentDocId,
Approved = 0,
Rate = 0,
MaxExecutionDate = grouped.Max(x=>x.T6201.ExecutionDate),
GLAccount = grouped.Key.GLAccount,
PaymentOrderAmount = grouped.Key.PaymentOrderAmount,
Constant1 = 0,
ReferenceDocument = grouped.Key.ReferenceCode,
Quantity = grouped.Key.T6126_Quantity,
TransactionId = grouped.Key.TransactionId,
TransactionSubId = grouped.Key.TransactionSubId,
Constant2 = 0,
PaymentOrder = grouped.Key.PaymentOrderId,
PaymentCurrency = grouped.Key.PayCurrency,
TransationSplitNumber = grouped.Key.TransactionSplitNumber
}).ToList()
, когда я выполнить запрос, я получаю исключение:
NotSupportedException: Unable to create a constant value of type
'T6351_POrdAccPDocLine'. Only primitive types ('such as Int32, String, and
Guid') are supported in this context.
I пытался найти причину исключения без везения.
Почему я продолжаю получать исключения?
* Edit: *
Я изменил вторую строку запроса на:
from T6340 in PayOrders
join T6351 in POrderAccPDocLines on T6340.Id equals T6351.PaymentDocId ...
Теперь я получаю такое же исключение на T6321 лица. Я предполагаю, что это способ сделать (преобразовать операторы для использования объединений), но я не знаю, как это можно сделать с внешним соединением (строки 5-6 в запросе), поскольку у меня нет опции DefaultIfEmpty () при использовании соединения.
Я немного стучу головой. Вы можете мне помочь?
Большое спасибо.
Возможно, эта линия не может быть решена: 'MaxExecutionDate = grouped.Max (х => x.T6201.ExecutionDate)', так что внутри конструктора из 'PaymentDataStore', который, вероятно, является моделью. – Silvermind
Nop, я прокомментировал эту строку и все тот же исключение. – Shpongle
Исключение, скорее всего, является результатом вашей группы на уровне сущности 'group new { T6321, T6125, T6351, T6126_A, T6340, T6201 }' Попробуйте группировать примитивные типы, если это опция. Также сгенерированный sql, вероятно, является гигантским, потому что он будет группироваться по каждому полю каждой сущности, используемой в группе. Возможно, [LinqPad] (http://www.linqpad.net/) - это хорошая идея, чтобы посмотреть, что такое sql. Пожалуйста, дайте только минимум запроса, который создаст исключение, и классы/сущности, которые в нем используются. – Silvermind