所以我有三個表:LINQ的:有三個嵌套層次
CREATE TABLE tblUser
(
[pkUserID] [int] IDENTITY(1,1) NOT NULL,
[userName] [varchar](150) NULL,
[fkCompanyID] [int] NOT NULL
)
CREATE TABLE tblCompany
(
[pkCompanyID] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](255) NULL
)
CREATE TABLE tblSystem
(
[pkSystemID] [int] IDENTITY(1,1) NOT NULL,
[systemName] [varchar](150) NULL,
[fkCompanyID] [int] NULL
)
這是我的數據傳輸對象:
public class SystemDTO
{
public int pkSystemId { get; set; }
public string Name { get; set; }
public int? fkCompanyId { get; set; }
}
public class CompanyDTO
{
public int pkCompanyId { get; set; }
public string Name { get; set; }
public IEnumerable<SystemDTO> Systems { get; set; }
}
public class UserDTO
{
public int pkUserId { get; set; }
public string Name { get; set; }
public IEnumerable<CompanyDTO> Companies { get; set; }
}
這是LINQ查詢我試圖做的事:
var result= (
from user in db.tblUsers
select new UserDTO()
{
pkUserId=user.pkUserID,
Name=user.realName,
Companies=
(
from company in db.tblCompanies
where user.fkCompanyID==company.pkCompanyID
select new CompanyDTO()
{
pkCompanyId=company.pkCompanyID,
Name=company.name,
Systems=
(
from system in db.tblSystem
where system.fkCompanyId==company.pkCompanyId
select new SystemDTO()
{
pkSystemId=system.pkSystemID,
Name=system.systemName,
fkCompanyId=system.fkCompanyID
}
)
}
)
}
).ToList();
此查詢的問題是,最內在的查詢
from system in db.tblSystem
where system.fkCompanyId==company.pkCompanyId
select new SystemDTO()
{
pkSystemId=system.pkSystemID,
Name=system.systemName,
fkCompanyId=system.fkCompanyID
}
導致linq將sql轉換爲每個實體選擇一個。我知道我可以跳過選擇並循環結果並設置屬性。像這樣:
var lsSystem= db.tblSystem.Select (s =>new SystemDTO(){pkSystemId=s.pkSystemID,Name=s.systemName,fkCompanyId=s.fkCompanyID}).ToList();
foreach (var user in result)
{
foreach (var company in user.Companies)
{
company.Systems=lsSystem.Where (a =>a.fkCompanyId==company.pkCompanyId).ToList();
}
}
這將導致linq做兩個選擇,而不是每個實體。所以,現在我的問題。有沒有其他的方式來做到這一點?我可以用另一種方式填充內部集合嗎?
任何暗示將理解
EDIT
甲暗示是使用loadoption。系統和公司之間找不到負載。但是我可以在兩者之間加入加載選項。公司與用戶是這樣的:
var option=new DataLoadOptions();
option.LoadWith<tblCompany>(a=>a.fkCompanytblUsers);
db.LoadOptions=option;
但這對查詢沒有影響它仍然是翻譯成很多選擇
EDIT2
正如在回答說評論負載選項不申請這個linq查詢。
誰投下了這個問題。請解釋.. – Arion 2012-02-23 06:58:06