在我的Entityframework模型中,我有一个类型/表“ModelElement”,它链接到一个类型/表“ElementToComponentMapping”。导航/外键是“ModelID”和“ElementNo”。
我需要编写一个基于某些过滤条件返回ModelElement实例的方法,其中还包含链接到ModelElement实例的ElementToComponentMapping的内容。挑战在于我还需要过滤从ElementToComponentMapping返回的内容,这意味着它看起来不像我可以使用.Include
所以这不起作用,因为我不能在where子句
中使用包含/导航类型public ModelElement GetModelElement(int modelID, int modelElementNo, int version)
{
return (from c in context.ModelElements.Include("ElementToComponentMapping")
where c.ModelID == modelID && c.ElementNo == modelElementNo
&& c.ElementToComponentMappings.Where(m => m.version == version)
select c).FirstOrDefault();
}
我的第二次尝试是首先查询主“ModelElement”对象,然后分别查询关联的“ElementToComponentMappings”,并将其设置为“ModelElement”的属性
public ModelElement GetModelElement(int modelID, int modelElementNo, int version)
{
ModelElement newElement = (from c in context.ModelElements
where c.ModelID == modelID && c.ElementNo == modelElementNo
select c).FirstOrDefault();
newElement.ElementToComponentMappings =
(from m in context.ElementToComponentMappings
where m.ModelID == modelID
&& m.ElementNo == modelElementNo
&& m.version == version
select m).FirstOrDefault();
return newElement;
}
但这也不起作用,因为直接查询“ElementToComponentMappings”对象返回的类型与“ModelElement”对象上的“ElementToComponentMappings”属性不同。
这看起来像一个简单的操作 - 获取外键链接表的值,在这里你可以过滤你从FK表的内容中得到的东西,所以希望我只是遗漏了一些明显的东西......?
答案 0 :(得分:1)
类型不同,因为您的newElement.ElementToComponentMappings
是集合,但您的查询只返回单个实例。
你可以尝试使用它:
context.ContextOptions.LazyLoadingEnabled = false;
var newElement = (from c in context.ModelElements
where c.ModelID == modelID && c.ElementNo == modelElementNo
select c).FirstOrDefault();
var mapping = (from m in context.ElementToComponentMappings
where m.ModelID == modelID
&& m.ElementNo == modelElementNo
&& m.version == version
select m).FirstOrDefault();
// now check if newElement.ElementToComponentMappings contains your single item
您也可以尝试使用它:
context.ContextOptions.LazyLoadingEnabled = false;
var newElement = (from c in context.ModelElements
where c.ModelID == modelID && c.ElementNo == modelElementNo
select c).FirstOrDefault();
((EntityCollection<ElementToComponentMappings>)newElement.ElementToComponentMappings)
.CreateSourceQuery()
.FirstOrDefault(m.version == version); // You don't need to check FKs here
// now check if newElement.ElementToComponentMappings contains your single item
如果你的类型被代理并且启用了延迟加载,这些方法都不起作用,因为这个预期的自动关系修正不会将导航属性标记为已加载(如果启用了延迟加载,则下次访问该属性将触发延迟加载并加载所有其他实体)。