2014-03-31 34 views
1

我不得不從數據庫中下載一些複雜的數據,這些數據集合了大量有關後期的有用信息。我想這樣做:表達式不能轉換爲商店表達式

var list = (from message in db.BLOGS_MESSAGES 
      where message.BLOG_ID == blogId 
      orderby message.CREATED_DATE descending 
      select new BlogMessage() 
      { 
        AUTHORS = **(from author in message.AUTHORS 
           select author.USERS).ToArray()**, 
        CREATED_BY = message.CREATED_BY, 
        CREATED_DATE = message.CREATED_DATE, 
        BLOG_MESSAGE_ID = message.POST_ID, 
        MESSAGE_TITLE = message.TITLES.TITLE, 
        TAGS = **(from tag in message.TAGGED_MESSAGES 
          select tag.TAGS).ToArray()**, 
        LOGIN = message.USERS.LOGIN, 
        MESSAGE = message.MESSAGES.MESSAGE, 
        MESSAGE_ID = message.MESSAGE_ID, 
        POST_NOTE = message.POST_NOTES.Sum(x => (long?)x.NOTE) ?? 0/message.POST_NOTES.Count(), 
      }).ToList(); 

但它不起作用。它引發了一個無法在商店表達式中轉換表達式的異常。 到目前爲止,我做到了這樣:

var mlist = (from message in db.BLOGS_MESSAGES 
      where .... 
      orderby .... 
      select new { 
       AUTHORS = (from author in message.AUTHORS 
             select author.USERS), 
       .... 
      } 

List<BlogMessage> list = new List<BlogMessage>(); 
foreach(var item in mlist) 
{ 
    list.Add(new BlogMessage() 
    { 
      AUTHORS = item.AUTHORS.ToArray(), 
      ... 
    }); 
} 

是有可能使其工作「的第一種方式 - 風格」?

+0

如果從'更改類型'BlogMessage.AUTHORS'網友[]''到IEnumerable的'或'的IQueryable '那麼第一種方式將是工作,而無需調用'ToArray的' – Grundy

回答

1

您可以:

  1. 變化BlogMessage.AUTHORS是一個IEnumerable<USERS>並刪除.ToArray()電話查詢像格蘭迪建議。
  2. 在創建BlogMessage之前將結果帶入內存。

例如:

var step1 = db.BLOGS_MESSAGES 
       .Where(...) 
       .Select(message => new { 
        Authors = message.AUTHORS.Select(a => a.USERS), // No .ToArray() 
        ... 
       }).ToList(); 

var step2 = step1.Select(message => New BlogMessage { 
       Authors = message.Authors.ToArray(), 
       ... 
      }).ToList(); 
相關問題