LINQ to Entity: Как привести сложный тип в DTO
Фон:
Я создал функцию импорта, которая доступна в моем объекте контекста как GetJournalViewItemsQuery()
Функция import возвращает сложный тип с именем JournalViewItem.
Теперь, когда я пытаюсь загрузить 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; }
}
}
}