LINQ 到实体:如何将复杂类型强制转换为 DTO



背景:

  1. 我创建了一个函数导入,它在我的上下文对象中可用为 GetJournalViewItemsQuery()

  2. 函数导入返回一个名为 JournalViewItem 的复杂类型。

  3. 现在,当我尝试将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 表达式查询回调方法的结果。

您会在我输入问题的原始帖子中找到答案。

相关内容

  • 没有找到相关文章

最新更新