使用多表Includes对EF LINQ查询结果进行整形
下面我有一个使用方法语法的简单LINQ EF查询。我使用Include语句连接四个表:Event和Doc是两个主表,EventDoc是一个多对多链接表,DocUsage是一个查找表 我的挑战是,我只想通过从四个表中选择特定的列来形成结果。但是,编译器给了我一个编译器给了我以下错误: “System.Data.Objects.DataClasses.EntityCollection不包含“Doc”的定义,并且找不到接受类型为“System.Data.Objects.DataClasses.EntityCollection”的第一个参数的扩展方法“Doc” 我相信这很容易,但我还没有弄明白。我还没有找到一个例子,说明有人使用多表include,但也塑造了投影 谢谢,马克使用多表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
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”(复数),以处理“许多”事件文档。