使用多表包含形成EF LINQ查询结果

时间:2011-01-17 02:47:23

标签: linq entity-framework

我在下面使用方法语法进行简单的LINQ EF查询。我正在使用我的Include语句来连接四个表:Event和Doc是两个主表,EventDoc是一个多对多链接表,DocUsage是一个查找表。

我的挑战是,我只想从四个表中的每个表中选择特定的列来塑造我的结果。但是,编译器给出了编译器给出了以下错误:

'System.Data.Objects.DataClasses.EntityCollection不包含“Doc”的定义,并且没有扩展方法'Doc'可以找到接受类型'System.Data.Objects.DataClasses.EntityCollection'的第一个参数。

我确信这很容易,但我不知道这一点。我无法找到一个使用多表包含但也影响投影的人的例子。

THX,马克

var qry= context.Event
    .Include("EventDoc.Doc.DocUsage")
    .Select(n => new
    {
        n.EventDate,
        n.EventDoc.Doc.Filename,  //<=COMPILER ERROR HERE
        n.EventDoc.Doc.DocUsage.Usage
    })
    .ToList();

    EventDoc ed;
    Doc d = ed.Doc;  //<=NO COMPILER ERROR SO I KNOW MY MODEL'S CORRECT
    DocUsage du = d.DocUsage;

alt text alt text

1 个答案:

答案 0 :(得分:1)

如果没有模型的屏幕截图,很难知道发生了什么,包括每个实体的导航属性。

但如果您说事件文档 EventDoc 是连接表)之间的多对多,并假设您的联接表只有FK,因此不需要映射,那么不应该只有一个事件 许多 文档' S'

此查询:

var query = ctx.Event.Include("EventDoc.Doc");

意味着(基于缺乏多元化):单个Event有一个EventDoc,只有一个Doc。

但不应该是:单个Event有一个EventDoc,它有很多Doc。

因此,您的预测并没有多大意义。您尝试投放到匿名类型,使用 EventDate 文件名作为单个文档,但事件有许多文档。

也许像这样的投影会更合适:

var query = ctx.Event.Include("EventDoc.Docs.DocUsage")
                     .Select(x => new
                     {
                        EventDate = x.EventDate,
                        DocsForEvent = x.EventDocs.Docs
                     }).ToList();

为此你工作,你需要修复你的模型。我很惊讶它甚至验证/编译。

您的模型错误或您对问题中数据库基数的描述是。 :)

当然,我可能会完全误解你的数据库和/或模型 - 所以如果我告诉我,我会删除这个答案。