Неожиданный тип возврата при использовании Func в проекции запроса Join - PullRequest
2 голосов
/ 24 октября 2019

У меня есть запрос на соединение, и я хочу спроецировать один из объединяемых объектов с некоторыми небольшими изменениями в нем. Я понял, что лучший способ сделать это - проецировать Func, который вносит необходимые мне изменения.

Из двух списков, к которым я присоединяюсь, один - это List<dynamic>, а другой -это List<ReceiptBE>.

My Func должен возвращать ReceiptBE, но в проекции соединения, когда я вызываю Func, результат запроса соединения имеет тип IEnumerable<dynamic>. Однако, когда я преобразую тот же Func в метод Inline, результат того же запроса соединения имеет тип IEnumerable<ReceiptBE>.

Реализация Func:

public void Method1()
{
        Func<ReceiptBE, dynamic, ReceiptBE> myFunc = (receipt, link) =>
        {
                receipt.something = link.something.ToString();
                return receipt;
        };

        var receiptDetails = new List<ReceiptBE>();
        var receiptLinks = new List<dynamic>(); 

        //result is IEnumerable<dynamic>
        //why is result not IEnumerable<ReceiptBE> ?
        var result = from receiptLink in receiptLinks
                                join receiptDetail in receiptDetails on receiptLink.something.ToString() equals receiptDetail.something
                                select myFunc(receiptDetail, receiptLink);

        //result2 is IEnumerable<ReceiptBE>
        var result2 = from receiptLink in receiptLinks
                                join receiptDetail in receiptDetails on receiptLink.something.ToString() equals receiptDetail.something
                                select myFunc(receiptDetail, receiptLink) as ReceiptBE;

}   

Реализация локального метода:

public void Method2()
{
        ReceiptBE myInlineMethod(ReceiptBE receipt, dynamic link)
        {
                receipt.something = link.something.ToString();
                return receipt;
        }

        var receiptDetails = new List<ReceiptBE>();
        var receiptLinks = new List<dynamic>(); 

        //result is IEnumerable<ReceiptBE>
        var result = from receiptLink in receiptLinks
                                join receiptDetail in receiptDetails on receiptLink.something.ToString() equals receiptDetail.something
                                select myInlineMethod(receiptDetail, receiptLink);
}

Кроме того, когда я пишу myInlineMethod как метод частного класса, снова тип результата становится IEnumerable<dynamic>

То, что я хочу в result, равно IEnumerable<ReceiptBE> и поскольку локальный метод является функцией ac # 7 (мало кто в организации использует VS2015), я застрял с реализацией Func с приведением.

Пожалуйста, направьте меня в документы, где я могу прочитать об этомповедение Func.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...