背景:
-
我创建了一个函数导入,它在我的上下文对象中可用为 GetJournalViewItemsQuery()
-
函数导入返回一个名为 JournalViewItem 的复杂类型。
-
现在,当我尝试将JournalViewItem加载到名为JournalEntry的应用程序DTO中时,我出现错误:
错误 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();
错误发生在"新日记条目"行。
我的问题:如何将期刊视图项目复杂类型转换为我的 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 域服务为 Silverlight 应用程序生成的代码。因此,需要执行 Context.GetJournalViewItemsQuery(),然后我可以使用 @Chuck.Net 和 JanR 建议的 LINQ 表达式查询回调方法的结果。
这是那些可能感兴趣的人的工作代码:
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));
}
}
您需要做的是,在新的 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 对象的样子。
编辑:添加了{}
我创建了一个控制台应用程序来测试@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; }
}
}
}
我稍微研究了一下 complx 类型。我在自己的项目中尝试了以下代码,并能够重现您提到的错误:
var result = (from y in CS.PSMBIPMTTXLOGs select new PSMBIPMTCONTROL(){MBI_PMT_TX_ID = y.MBI_PMT_TX_ID}).ToList();
但是当我将其更改为返回匿名类型时,它起作用了:var result = (来自 CS 中的 y。PSMBIPMTTXLOGs select new {MBI_PMT_TX_ID = y.MBI_PMT_TX_ID})。ToList();
您提到您甚至尝试创建一个匿名类型而不是将其更新到我的 DTO 中,但它仍然抱怨。您可以发布用于返回匿名类型的代码及其提供的错误消息吗?谢谢。
我找到了问题的原因。我没有提到(我很抱歉)我正在处理从 WCF RIA 域服务为 Silverlight 应用程序生成的代码。因此,需要执行 Context.GetJournalViewItemsQuery(),然后我可以使用 @Chuck.Net 和 JanR 建议的 LINQ 表达式查询回调方法的结果。
您会在我输入问题的原始帖子中找到答案。