2013-06-25 57 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非常感謝。 –