LINQ to Entity: Как привести сложный тип в DTO

Фон:

  1. Я создал функцию импорта, которая доступна в моем объекте контекста как GetJournalViewItemsQuery()

  2. Функция import возвращает сложный тип с именем JournalViewItem.

  3. Теперь, когда я пытаюсь загрузить JournalViewItem в DTO моего приложения с именем JournalEntry, я получаю сообщение об ошибке:

    Ошибка 7 Не удается неявно преобразовать тип "MyApp.Infrastructure.Models.JournalEntry" в "MyApp.SqlData.JournalViewItem"

Это код:

             var journalEntry =  Context.GetJournalViewItemsQuery()
                .Where(i => i.JournalItemId == _journalEntryId)
                .Select(x => new JournalEntry(x.JournalItemId,
                    x.HeaderText,x.JournalText, x.LastUpdatedOn,
                    x.JournalItemTypeId)).Single();

Ошибка происходит в строке "new JournalEntry".

Мой вопрос: как я могу привести сложный тип JournalViewItem к моему DTO?

Спасибо

После предложения @JanR у меня все та же проблема. Модифицированный код:

       var journalEntry = Context.GetJournalViewItemsQuery()
             .Where(i => i.JournalItemId == _journalEntryId)
             .Select(x => new JournalEntry
             {
                 JournalEntryNumber = x.JournalItemId,
                 HeaderText = x.HeaderText,
                 BodyText = x.JournalText,
                 LastUpdatedOn = x.LastUpdatedOn,
                 JournalEntryType = x.JournalItemTypeId
             }).Single();

Я выяснил причину моей проблемы. Я не упомянул (мои извинения), что я работаю над сгенерированным кодом из приложения WCF RIA Domain Services for Silverlight. Поэтому Context.GetJournalViewItemsQuery() должен быть выполнен, и ТОГДА я могу запросить результаты по моему методу обратного вызова, используя выражение LINQ, которое предложили @Chuck.Net и JanR.

Вот рабочий код для тех, кто может быть заинтересован:

        public IList<JournalEntryHeader> GetJournalEntryHeaders()
    {
        PerformQuery<JournalViewItem>(Context.GetJournalViewItemsQuery(), GetJournalEntryHeadersFromDbComplete);

        return _journalHeaders;
    }

    void PerformJournalEntryHeadersQuery(EntityQuery<JournalViewItem> qry,
                            EventHandler<EntityResultsArgs<JournalViewItem>> evt)
    {
        Context.Load<JournalViewItem>(qry, r =>
        {
            if (evt != null)
            {
                try
                {
                    if (r.HasError)
                    {
                        evt(this, new EntityResultsArgs<JournalViewItem>(r.Error));
                    }
                    else if (r.Entities.Count() > 0)
                    {
                        evt(this, new EntityResultsArgs<JournalViewItem>(Context.JournalViewItems));
                    }
                    else if (r.Entities.Count() == 0 && _currentJournalItemsPage > 0)
                    {
                        GetPrevPageJournalEntryHeadersAsync();
                    }
                }
                catch (Exception ex)
                {
                    evt(this, new EntityResultsArgs<JournalViewItem>(ex));
                }
            }
        }, null);
    }


    void GetJournalEntryHeadersFromDbComplete(object sender, EntityResultsArgs<JournalViewItem> e)
    {
        if (e.Error != null)
        {
            string errMsg = e.Error.Message;
        }
        else
        {
            _journalHeaders = e.Results
                .Select(
            x => new JournalEntryHeader(x.JournalItemId,
                                     x.ProjectName,
                                     x.TopicName,
                                     x.HeaderText,
                                     x.EntryTypeName,
                                     x.LastUpdatedOn)).ToList();

            GetJournalEntryHeadersComplete(this, new JournalEntryHeaderItemsEventArgs(_journalHeaders));
        }
    }

4 ответа

Решение

Я выяснил причину моей проблемы. Я не упомянул (мои извинения), что я работаю над сгенерированным кодом из приложения WCF RIA Domain Services for Silverlight. Поэтому Context.GetJournalViewItemsQuery() должен быть выполнен, и ТОГДА я могу запросить результаты по моему методу обратного вызова, используя выражение LINQ, которое предложили @Chuck.Net и JanR.

Вы найдете ответ в оригинальном сообщении, где я ввел вопрос.

Вам нужно сделать следующее: в новой функции JournalEntry() вам нужно будет установить все свойства для объекта JournalViewItem.

 var journalEntry =  Context.GetJournalViewItemsQuery()
                .Where(i => i.JournalItemId == _journalEntryId)
                .Select(x => new JournalEntry {
                    JournalEntryId = x.JournalItemId,
                    HeaderText = x.HeaderText,
                    JournalText = x.JournalText
                    //etc
                    }).Single();

Я просто угадываю фактические имена свойств здесь, так как я не знаю, как выглядит объект JounralEntry.

РЕДАКТИРОВАТЬ: добавлено {}

Я немного посмотрел на тип complx. Я попробовал следующий код в своем собственном проекте и смог воспроизвести ошибку, которую вы упомянули:

var result = (from y in CS.PSMBIPMTTXLOGs select new PSMBIPMTCONTROL(){MBI_PMT_TX_ID = y.MBI_PMT_TX_ID}).ToList();

Но когда я изменил его, чтобы он возвращал анонимный тип, это сработало: var result = (из y в CS.PSMBIPMTTXLOGs выберите новый {MBI_PMT_TX_ID = y.MBI_PMT_TX_ID}).ToList();

Вы упомянули, что даже пытались создать анонимный тип вместо добавления его в мой DTO, но он все еще жалуется. Можете ли вы опубликовать свой код для возврата анонимного типа и сообщение об ошибке, которое он дает? Спасибо.

Я создал ConsoleApp для проверки ответа @JanR. Кажется, работает правильно.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StackOverFlowConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            List<JournalViewItem> JournalViewItems = new List<JournalViewItem>()
            {
                new JournalViewItem(){JournalItemId =1, HeaderText="HeaderText", JournalText="JournalText", LastUpdatedOn= DateTime.Today, JournalItemTypeId=1},

            };

            int _journalEntryId = 1;

            var journalEntry = JournalViewItems
              .Where(i => i.JournalItemId == _journalEntryId)
              .Select(x => new JournalEntry
              {
                  JournalEntryNumber = x.JournalItemId,
                  HeaderText = x.HeaderText,
                  BodyText = x.JournalText,
                  LastUpdatedOn = x.LastUpdatedOn,
                  JournalEntryType = x.JournalItemTypeId
              }).Single();

        }

        class JournalViewItem
        {

            public int JournalItemId { get; set; }
            public string HeaderText { get; set; }
            public string JournalText { get; set; }
            public DateTime LastUpdatedOn { get; set; }
            public int JournalItemTypeId { get; set; }
        }

        class JournalEntry
        {

            public int JournalEntryNumber { get; set; }
            public string HeaderText { get; set; }
            public string BodyText { get; set; }
            public DateTime LastUpdatedOn { get; set; }
            public int JournalEntryType { get; set; }
        }

    }
}
Другие вопросы по тегам