【问题标题】:Linq to Entities (EF 4.0) and group 2 unrelated tables into an aggregated objectLinq to Entities (EF 4.0) 并将 2 个不相关的表分组到一个聚合对象中
【发布时间】:2012-08-21 09:11:00
【问题描述】:

我有 2 个没有外键关系的表(文档和消息),但表消息将文档中的 id 列作为一列(糟糕的设计,我知道..)

表格文件: 文档编号, 名称

表消息: 消息 ID, 文档编号, 价值

一个文档对象可以有零个或多个消息对象

我想编写一个查询,返回一个名为 DocumentWithMessages 的聚合对象的列表:

public class DocumentWithMessages
{
Document Document {get;set;}
List<Message> Messages {get;set;}
}

查询应该返回所有文档(有或没有消息列表)

我开始写这样的方法,但它给了我一个例外:

public ICollection<DocumentWithDocumentSplitMessages> GetSplitJobsWithMessages()
        {
            var messages = (from dm in ObjectContext.DocumentSplitMessages select dm).ToList();
            var jobs = from d in ObjectContext.Documents                       

                       let msgs = messages.Where(dm => dm.DocID == d.DocID).ToList()

                       select new DocumentWithDocumentSplitMessages()
                           {
                               Document = d,
                               DocumentSplitMessages = msgs
                           };                                    

            return jobs.ToList();
        }

例外是:

System.NotSupportedException : LINQ to Entities 无法识别方法 'System.Collections.Generic.List1[BraArkivDataModel.DocumentSplitMessage] ToList[DocumentSplitMessage](System.Collections.Generic.IEnumerable1[BraArkivDataModel.DocumentSplitMessage])' 方法,并且此方法无法转换为存储表达式。

如何编写这样的查询?

【问题讨论】:

  • 能改代码,为什么不能改EF型号?

标签: c#-4.0 entity-framework-4 linq-to-entities


【解决方案1】:

我认为您可以使用类似于您尝试过的方法,但在 let 子句上使用 IQueryable

var jobs = from d in ObjectContext.Documents                       

           let msgs = ObjectContext.DocumentSplitMessages.Where(dm => dm.DocID == d.DocID)

           select new DocumentWithDocumentSplitMessages()
           {
               Document = d,
               DocumentSplitMessages = msgs
           };                                    

        return jobs.ToList();

【讨论】:

  • 恐怕不适合我。仍然得到同样的例外。可能是由于我使用 IObjectSet 接口而不是 ObjectSet 类的原因吗? (Documents 和 DocumentSplitMessages 是 IObjectSets)
  • 我得到了解决方案。 DocumentWithDocumentSplitMessages 类中的 DocumentSplitMessages 列表必须是 IEnumerable。我把它作为一个 List 开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2011-05-24
  • 1970-01-01
  • 2010-11-26
  • 2023-04-02
相关资源
最近更新 更多