我在下面使用方法语法进行简单的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;
答案 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();
为此你工作,你需要修复你的模型。我很惊讶它甚至验证/编译。
您的模型错误或您对问题中数据库基数的描述是。 :)
当然,我可能会完全误解你的数据库和/或模型 - 所以如果我告诉我,我会删除这个答案。