2013-06-25 59 views
1

假设我在一个实体框架中使用代码优先的三个模型,其中一个是与另一个1-n关系并且与第三个具有1-1关系的主要模型。通过复合实体搜索CF实体框架

例如

public class Model { 
    [Key] 
    public int Id {get; set;} 

    public string value {get; set;} 

    // 1-N relationship to modelInfo 
    public virtual ICollection<ModelInfo> modelInfo {get; set;} 
} 

public class ModelInfo { 
    [Key] 
    public int Id {get; set;} 

    public string value2 {get; set;} 

    // 1-1 relationship between modelInfo and modelDetail 
    public virtual ModelDetail {get; set;} 

    [Required] 
    // link back to the model 
    public virtual Model model; 
} 

public class ModelDetail { 
    [Key] 
    public int Id {get; set;} 

    public string modelDetail {get; set;} 

    [Required] 
    // 1-1 link back to the modelInfo 
    public virtual ModelInfo modelInfo; 
} 

现在假定模型,假设你有一个模型的集合,已经从以前的LINQ查询。

IQueryable<Model> models; 

而且您需要找到哪个模型与具有modelDetail =“findme”的ModelDetail相关联?使用linq语法..或者甚至可能吗?

喜欢的东西

ModelDetail foundit = models.Where(m => m..??.. modelDetail=="findme"); 

我迷失在型号和ModelInfo之间的1-N关系

回答

1

ModelDetail

context.ModelDetails 
     .Where(md => md.modelDetail == "findme") 
     .Select(md => md.modelInfo.model) 

或者从ModelInfo

context.ModelInfos 
     .Where(mi => mi.modelDetail.modelDetail == "findme") 
     .Select(mi => mi.model); 

或者从Model:对于这个问题的答案

context.Models 
     .SelectMany(m => m.modelInfo) 
     .Select(mi => mi.modelDetail) 
     .Where(md => md.modelDetail == "findme"); 
+0

感谢:

context.Models .Where(m => m.modelInfo .Any(mi => mi.modelDetail.modelDetail == "findme")); 

Model返回ModelDetail。非常接近我想要做的事情。我喜欢模型中的第三种方法(我实际上并没有直接从我的上下文中公开子模型,也许是一个不好的决定,但它看起来是正确的,因为这些数据只能作为主模型的一部分存在)。这个例子找到了一个modelinfos模型,其中一个modelDetail == findme。但它实际上并没有选择modelDetail。它反而是返回一个模型..在这一点上,我仍然坚持寻找特定modelDetail的问题。 –

+0

请参阅我的编辑以从您的Model –

+0

返回ModelDetail非常感谢。 –