2014-04-01 69 views
0

背景:LINQ到實體:如何蒙上了複雜類型的DTO

  1. 我創建了一個函數導入它可在我的上下文對象GetJournalViewItemsQuery()

  2. 功能導入返回一個名爲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(); 

錯誤發生在 「新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域服務爲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)); 
     } 
    } 

回答

0

我發現了我的問題的原因。我沒有提及(我的道歉),我正在從WCF RIA域服務爲Silverlight應用程序生成代碼。因此需要執行Context.GetJournalViewItemsQuery(),然後我可以使用@Chuck.Net和JanR建議的LINQ表達式在我的回調方法上查詢結果。

你會在我輸入問題的原始文章中找到答案。

1

你需要做的是下面的,在新的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對象的樣子。

編輯:添加{}

+0

感謝@JanR的幫助。我嘗試了你的建議,但仍然出現了同樣的錯誤。我想你可能錯過了對象初始值設定項的大括號。 – user1309226

+0

下面的代碼: VAR JournalEntry的= Context.GetJournalViewItemsQuery() 。凡(I => i.JournalItemId == _journalEntryId) 。選擇(X =>新JournalEntry的 { JournalEntryNumber = x.JournalItemId, 的HeaderText = X .HeaderText, BodyText = x.JournalText, LastUpdatedOn = x.LastUpdatedOn, JournalEntryType = x.JournalItemTypeId })。Single(); – user1309226

+0

確實添加了{},在那裏發錯了。那麼它能工作嗎? – JanR

1

我創建了一個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; } 
     } 

    } 
} 
+0

謝謝你的答案@ Chuck.NET。我想澄清的是:在我原來的文章中Context.GetJournalViewItemsQuery()是一個函數import(st proc),它返回複雜類型。從你的例子中,我可以看到它如何與.NET對象和集合一起工作。我擁有的問題是試圖將EF複雜類型對象轉換爲JournalEntry對象。事實上,即使在select(x => new {JournalItemId = x.JournalItemId,...)中使用匿名類,它也會抱怨消息'無法將類型'AnonymousType#1'隱式轉換爲'MyApp .SqlData.JournalViewItem' – user1309226

1

我看了一下complx類型。我想在我自己的項目下面的代碼,並能夠重現您提到的錯誤:

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

但是,當我改變了它返回匿名類型,它的工作: VAR的結果=(Y的在CS.PSMBIPMTTXLOGs選擇新的{MBI_PMT_TX_ID = y.MBI_PMT_TX_ID})ToList();

你提到你甚至嘗試過創建一個匿名類型,而不是將它新增到我的DTO中,但它仍然抱怨。你可以發佈你的代碼來返回一個匿名類型和它給出的錯誤信息嗎?謝謝。

+0

感謝您的幫助@ Chuck.NET。 我找到了我的問題的原因。我沒有提及(我的道歉),我正在從WCF RIA域服務爲Silverlight應用程序生成代碼。因此需要執行Context.GetJournalViewItemsQuery(),然後我可以使用你和JanR建議的LINQ表達式在我的回調方法上查詢結果。我在最初的帖子上發佈了最終代碼。我給了你一個無論如何都要投票贊成有用的條目,再次感謝您的幫助,我不認爲這是理所當然的。 – user1309226