EntityFramework/LINQ-从关联的表/类型中获取筛选的内容

EntityFramework/LINQ-从关联的表/类型中获取筛选的内容,linq,entity-framework-4,Linq,Entity Framework 4,在我的Entityframework模型中,我有一个类型/表“ModelElement”,它链接到一个类型/表“ElementToComponentMapping”。导航键/外键为“ModelID”和“ElementNo” 我需要编写一个方法,根据某些过滤条件返回ModelElement的实例,其中还包括链接到ModelElement实例的ElementToComponentMapping的内容。挑战在于,我还需要过滤从ElementToComponentMapping返回的内容,这意味着它看起

在我的Entityframework模型中,我有一个类型/表“ModelElement”,它链接到一个类型/表“ElementToComponentMapping”。导航键/外键为“ModelID”和“ElementNo”

我需要编写一个方法,根据某些过滤条件返回ModelElement的实例,其中还包括链接到ModelElement实例的ElementToComponentMapping的内容。挑战在于,我还需要过滤从ElementToComponentMapping返回的内容,这意味着它看起来无法使用

所以这不起作用,因为我不能在where子句中使用included/navigation类型

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”的属性

但这也不起作用,因为直接查询“ElementToComponentMappings”对象返回的类型与“ModelElement”对象上的“ElementToComponentMappings”属性不同


这似乎是一个简单的操作-获取外键链接表的值,在这里过滤从FK表的内容中获得的内容,所以希望我在这里遗漏了一些明显的东西…?

类型不同,因为您的
新元素.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
您也可以尝试使用以下方法:

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
context.ContextOptions.LazyLoadingEnabled=false;
var newElement=(来自context.modelements中的c)
其中c.ModelID==ModelID&&c.ElementNo==modelementno
选择c).FirstOrDefault();
((EntityCollection)新元素。元素到组件映射)
.CreateSourceQuery()
.FirstOrDefault(m.version==version);//你不需要在这里检查FKs
//现在检查newElement.ElementToComponentMappings是否包含单个项目

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

感谢您的输入,不幸的是,现在还没有:在您的第一个建议中,newElement.ElementToComponentMappings属性设置在哪里?在您的第二个建议中,我得到一个错误,ElementToComponentMappings不包含FirstOrDefault的定义,并且最佳扩展方法重载具有无效参数。关于类型差异,您是对的ElementToComponentMappings是一个集合-这是否意味着我应该在某个时候调用ToList?在第一种情况下,这是一个技巧。如果所有配置都正确,则无需设置该属性。它应该自动填充。第二种情况很奇怪
CreateSourceQuery
应该返回
ObjectQuery
,这是
IQueryable
的实现,它提供了
FirstOrDefault
。只有在您的实体未代理的情况下,您使用
ToList
的方式才会起作用,否则您将得到一些错误,无法将新集合分配给导航属性。+1提供有用的提示、技巧和见解。最后,我无法让这种方法发挥作用,所以用了另一种方法。