Как объединить три таблицы и поместить их в ViewModel с помощью LINQ Lambda в ASP.Net MVC? - PullRequest
0 голосов
/ 18 июня 2019

У меня проблема при попытке объединить три табличных данных и поместить их в модель представления.

Вот мой код:

var idSearchJoin = payoutdb.payout_transaction    // your starting point - table in the "from" statement
               .Join(payoutdb.payout_remittance, // the source table of the inner join
               transaction => transaction.transid, // Select the primary key (the first part of the "on" clause in an sql "join" statement)
               remit => remit.transid,   // Select the foreign key (the second part of the "on" clause)
               (transaction, remit) => new TransactionReport() // selection
                {
                   transid = transaction.transid,
                   senderRefId = transaction.senderRefId,
                   senderName = transaction.senderName,
                   senderAddr = transaction.senderAddr,
                   batchid = transaction.batchid,
                   requestDate = transaction.requestDate,
                   benefName = transaction.benefName,
                   benefacctno = transaction.benefacctno,
                   amount = remit.amount,
                   purpose = remit.purpose,
                   status = transaction.status
               })
               .Join(payoutdb.payout_bank,
               remit => remit.receivingbank,
               bank => bank.bankid,
               (remit,bank) => new TransactionReport()
               {
                   receivingbank = bank.name
               })
               .Where(transactremit => transactremit.senderRefId == searchTxt).ToList();

Но этот код выдает ошибку An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code Дополнительная информация The specified type member 'receivingbank' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported дает мне подсказку о проблеме, но я все еще не могу ее решить,Этот код будет работать только в том случае, если я удалю эту часть кода:

.Join(payoutdb.payout_bank,
               remit => remit.receivingbank,
               bank => bank.bankid,
               (remit,bank) => new TransactionReport()
               {
                   receivingbank = bank.name
               })

Но мне нужна эта часть кода, чтобы я смог получить эквивалент receivingbank из payout_transaction к bankidв таблице payout_bank.Это мой SQL-код для этой работы:

SELECT a.transid,c.name
FROM payout_transaction a
INNER JOIN 
payout_remittance b
ON a.transid = b.transid
INNER JOIN
payout_bank c
ON b.receivingbank = c.bankid
WHERE senderRefId =  searchtxt;

Но я не знаю, как это сделать на LINQ Lambda. У вас есть какие-либо предложения или какие-либо обходные пути, как я могу решить эту проблему?

1 Ответ

1 голос
/ 20 июня 2019

При условии, что в моделях правильно определены отношения, объединенный результирующий набор может быть выбран в синтаксисе метода EF следующим образом, без использования каких-либо операторов Join:

var idSearchJoin = DBContext.payout_transactionDBSet                        
                  .Include(i => i.payout_remittanceNavigationProp)                                     
                  .Include(p => p.payout_bankNavigationProp)                                 
                  .Where(transactremit => transactremit.senderRefId == searchTxt)              
                  .Select(s => new TransactionReport() 
                   {
                     transid = s.transid,
                     senderRefId = s.senderRefId,
                     senderName = s.senderName,
                     senderAddr = s.senderAddr,
                     batchid = s.batchid,
                     requestDate = s.requestDate,
                     benefName = s.benefName,
                     benefacctno = s.benefacctno,
                     amount = s.payout_remittanceNavigationProp.amount,
                     purpose = s.payout_remittanceNavigationProp.purpose,
                     status = s.status,
                     receivingbank = s.payout_bankNavigationProp.name
                   }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...