2017-11-15 5 views
1

に参加把握することはできません、私はこの作業を持っており、基本的なSQLクエリは、私が欲しいものです:は、LINQのはLinqPadで

from userProcesses in UserProcesses 
join formProcesses in FormProcesses 
    on userProcesses.ProcessID equals formProcesses.Process_ProcessID 
join forms in Forms 
    on formProcesses.Form_FormID equals forms.FormID 
join userForms in UserForms 
    on new {userProcesses.UserProcessID, forms.FormID} equals 
     new {userForms.UserProcessID, userForms.FormID} into combined 
from c in combined.DefaultIfEmpty() 
select new 
{ 
    UserFormID = c == null ? (int?) null : c.UserFormID, 
    FormID = forms.FormID, 
    Name = forms.Name 
} 

問題は、私の実際のコードでは、ある、FormProcessesテーブルではありませんそれ自体は公開されていますが、ナビゲーションプロパティです。私は私のソフトウェアでこのクエリを書く方法に苦労してきました。あなたは、ナビゲーションプロパティを見ることができるので、ここで

は私のモデルのスケルトン図である:私は間違っ

public class UserProcess : BaseModel 
    { 
     [Key] 
     public int UserProcessID { get; set; } 

     [Required] 
     [ForeignKey("Process")] 
     public int ProcessID { get; set; } 

     public Process Process { get; set; } 

     public virtual ICollection<UserForm> UserForms { get; set; } 
    } 

public class Form : Common.BaseModel 
    { 
     [Key] 
     public int FormID { get; set; }  

     public virtual ICollection<Process> Processes { get; set; } 
    } 

public class UserForm : Common.BaseModel 
    { 
     [Key] 
     public int UserFormID { get; set; } 

     [Required] 
     [ForeignKey("UserProcess")] 
     public int UserProcessID { get; set; } 

     public UserProcess UserProcess { get; set; } 

     [Required] 
     [ForeignKey("Form")] 
     public int FormID { get; set; } 

     public Form Form { get; set; } 
    } 

public class Process : Common.BaseModel 
    { 
     [Key] 
     public int ProcessID { get; set; } 

     public virtual ICollection<Form> Forms { get; set; } 
    } 

何をやっている - どのように私はこの作業を得ることができますか?

答えて

1

すべての明示的な結合を、ナビゲーションプロパティを使用して「ナビゲート」することで置き換えることができます。

たとえば、次は

join formProcesses in FormProcesses 
    on userProcesses.ProcessID equals formProcesses.Process_ProcessID 
join forms in Forms 
    on formProcesses.Form_FormID equals forms.FormID 

に参加するにはなる:

質問で問題を解決する必要があり
from forms in userProcesses.Process.Forms 

。以下の参加の書き込みの

必要に応じて、LINQのエンティティへの道:

join userForms in UserForms 
    on new { userProcesses.UserProcessID, forms.FormID } equals 
     new { userForms.UserProcessID, userForms.FormID } into combined 

は次のとおりです。

let combined = from userForms in userProcesses.UserForms 
       where userForms.FormID == forms.FormID 
       select userForms 
関連する問題