2013-03-12 5 views
0

У меня есть следующий запрос с несколькими внутренними и внешними соединениями. Запрос создать новый класс, который не является частью структуры 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 () при использовании соединения.

Я немного стучу головой. Вы можете мне помочь?

Большое спасибо.

+0

Возможно, эта линия не может быть решена: 'MaxExecutionDate = grouped.Max (х => x.T6201.ExecutionDate)', так что внутри конструктора из 'PaymentDataStore', который, вероятно, является моделью. – Silvermind

+0

Nop, я прокомментировал эту строку и все тот же исключение. – Shpongle

+0

Исключение, скорее всего, является результатом вашей группы на уровне сущности 'group new { T6321, T6125, T6351, T6126_A, T6340, T6201 }' Попробуйте группировать примитивные типы, если это опция. Также сгенерированный sql, вероятно, является гигантским, потому что он будет группироваться по каждому полю каждой сущности, используемой в группе. Возможно, [LinqPad] (http://www.linqpad.net/) - это хорошая идея, чтобы посмотреть, что такое sql. Пожалуйста, дайте только минимум запроса, который создаст исключение, и классы/сущности, которые в нем используются. – Silvermind

ответ

0

Я думаю, что проблема здесь:

by new 
{ 
    ... 
    T6125, 
    ... 
} 

LINQ к Entities двигатель должен преобразовать выражение в SQL предложения, и он не в состоянии сделать это, если вы включите весь объект (а чем примитивный тип) в выражении.

+0

Нет удачи. Я удалил строки из группы, а также операторы select и все те же исключения. – Shpongle

0

Пусть это может помочь U ....

from po in payOrders 
join pod in POrderAccPDocLines on po.Id equals pod.PaymentDocId 
join pdl in PaymentDocLines on new { Id = pod.PaymentDocId, Line = pod.Line } equals new { Id = pdl.PaymentDocId, Line = pdl.Line } 
join ibdl in ItemBillPDocLines on new { Id = pdl.PaymentDocId, Line = pdl.Line } equals new { Id = ibdl.PaymentDocId, Line = ibdl.Line } into ItemBill //Outer Join 
from ibdl in ItemBill.DefaultIfEmpty() //Outer Join 
join....... 
Смежные вопросы