だから私は3つのテーブルれている:これらは私のデータ転送オブジェクトのLINQ:ネストされた3つのレベルのクエリ
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をエンティティごとに1つの選択に変換します。私は選択をスキップして結果をループし、プロパティを設定できることを知っています。このように:
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はエンティティごとに1つではなく2つの選択を行うようになります。だから今私の質問に。これを行う別の方法がありますか?インナーコレクションを別の方法で取り込むことはできますか?任意示唆
は
EDIT
示唆はloadoptionを使用することで理解されるであろう。私はシステムと会社の間に負荷を見つけることができません。しかし、私は間にloadoptionを含めることができます。当社及び利用者、このような:
var option=new DataLoadOptions();
option.LoadWith<tblCompany>(a=>a.fkCompanytblUsers);
db.LoadOptions=option;
しかし、これは、それはまだのようにコメントロード・オプションがない答えで述べて多くの選択
EDIT2
に翻訳されたクエリには影響しませんこのようなlinqクエリを適用します。
誰がこの質問に投票しました。説明してください。 – Arion