实体框架/ LINQ - 从关联的表/类型中获取过滤的内容

时间:2012-01-23 12:55:13

标签: linq entity-framework-4

在我的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表的内容中得到的东西,所以希望我只是遗漏了一些明显的东西......?

1 个答案:

答案 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

如果你的类型被代理并且启用了延迟加载,这些方法都不起作用,因为这个预期的自动关系修正不会将导航属性标记为已加载(如果启用了延迟加载,则下次访问该属性将触发延迟加载并加载所有其他实体)。