Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多表Includes对EF LINQ查询结果进行整形_Linq_Entity Framework - Fatal编程技术网

使用多表Includes对EF LINQ查询结果进行整形

使用多表Includes对EF LINQ查询结果进行整形,linq,entity-framework,Linq,Entity Framework,下面我有一个使用方法语法的简单LINQ EF查询。我使用Include语句连接四个表:Event和Doc是两个主表,EventDoc是一个多对多链接表,DocUsage是一个查找表 我的挑战是,我只想通过从四个表中选择特定的列来形成结果。但是,编译器给了我一个编译器给了我以下错误: “System.Data.Objects.DataClasses.EntityCollection不包含“Doc”的定义,并且找不到接受类型为“System.Data.Objects.DataClasses.Enti

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

我的挑战是,我只想通过从四个表中选择特定的列来形成结果。但是,编译器给了我一个编译器给了我以下错误:

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

我相信这很容易,但我还没有弄明白。我还没有找到一个例子,说明有人使用多表include,但也塑造了投影

谢谢,马克

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;
var qry=context.Event
.包括(“EventDoc.Doc.DocUsage”)
.选择(n=>new
{
n、 事件日期,

n、 EventDoc.Doc.Filename,//如果没有模型的屏幕盖,包括每个实体上的导航属性,很难知道发生了什么

但是,如果您说它是事件文档之间的多对多(其中事件文档是联接表),并且假设联接表只有FK,因此不需要映射,那么单个事件不应该有多个文档

此查询:

var query=ctx.Event.Include(“EventDoc.Doc”

这意味着(基于缺乏多元性):一个事件有一个事件文档,而该事件文档只有一个文档。

但这不应该是:一个事件有一个事件文档,它有许多文档。

因此,您的投影没有真正意义。您试图投影到一个匿名类型,其中包含单个文档的EventDate和Filename,但一个事件有多个文档

也许这样的投影更合适:

var query = ctx.Event.Include("EventDoc.Docs.DocUsage")
                     .Select(x => new
                     {
                        EventDate = x.EventDate,
                        DocsForEvent = x.EventDocs.Docs
                     }).ToList();
为此,您需要修复您的模型。我很惊讶它甚至可以验证/编译

您的模型错误,或者您在问题中对数据库基数的描述为:)


当然,我可能完全误解了您的数据库和/或模型-因此,如果让我知道,我将删除此答案。

这是非常正确的。您甚至可能需要
.Include(“EventDocs.Docs.DocUsage”)
如果每个事件都有多个
EventDoc
对象。是的,没错。让我们看看OP在我们投掷更多石头之前说了些什么。:)RPM-嘿,谢谢你在周日晚上的帖子!还有thx没有投掷石头,我知道你不知道我的模型。是的,这在我的模型中确实是一个多对多的模型。用户有很多文档,并且对于给定的event他们可以选择将0或多个文档与他们的任何事件关联。关于您发布的语法,这仍然无法为我编译。最大的问题是,编译器无法识别事件表之外的任何关系。它在投影中接受x.EventDoc,但不接受x.EventDoc.Doc。@sisdog-我明白了,““EventDoc”是您的联接表。有两个查询。1)为什么联接表中有“DocId”?如果删除此字段,事情会简单得多,因为联接表不需要映射,您可以执行
ctx.Event.Include(“Docs”)
。2)在“Event”实体上,您有“EventDoc”导航。这应该是“EventDocs”(复数),以处理“许多”事件文档。