无法弄清楚 Linq 连接
Can't figure out a Linq join
在 LinqPad 中,我有这个工作,底层 SQL 查询是我想要的:
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
table 本身并没有暴露,而是一个导航 属性。我一直在为如何在我的软件中编写此查询而苦苦挣扎。
这是我的模型的骨架视图,因此您可以看到导航属性:
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; }
}
我做错了什么 - 我怎样才能让它工作?
您可以通过导航属性将所有显式连接替换为 "navigating"。
例如,以下连接
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 to Entities 编写以下连接的方式:
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
在 LinqPad 中,我有这个工作,底层 SQL 查询是我想要的:
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
table 本身并没有暴露,而是一个导航 属性。我一直在为如何在我的软件中编写此查询而苦苦挣扎。
这是我的模型的骨架视图,因此您可以看到导航属性:
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; }
}
我做错了什么 - 我怎样才能让它工作?
您可以通过导航属性将所有显式连接替换为 "navigating"。
例如,以下连接
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 to Entities 编写以下连接的方式:
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