表达式无法转换为商店表达式

时间:2014-03-31 18:03:39

标签: c# linq entity-framework

我必须从数据库下载一些复杂的数据,这些数据汇集了大量有关post的有用信息。我想做这样的事情:

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(),
            ...
     });
}

是否有可能让它以第一种方式运作 - 风格&#39;

1 个答案:

答案 0 :(得分:1)

你可以:

  1. BlogMessage.AUTHORS更改为IEnumerable<USERS>并删除查询中的.ToArray()次调用,例如Grundy建议。
  2. 在创建BlogMessage之前将结果存入内存。
  3. 例如:

    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();