1 に答える
1
式には3つの引数が必要なため、これを行うことはできませんが、クエリからは常に1つの引数(シーケンスタイプ)を受け取ります。また、現在表示されているエラーを排除するために、最後の結合の後にクエリにselectステートメントが必要です。したがって、技術的には、3つのオブジェクトすべてを保持するタイプを作成できます。
public class Foo
{
public CmnCompany Company { get; set; }
public CmnCompanyReference CompanyReference { get; set; }
public CmnPartnerDetail PartnerDetail { get; set; }
}
そして、クエリからそのオブジェクトを選択します(心配しないでください、クエリはまだ実行されていません):
var query =
from p in this.Context.CmnCompanies
where organogramType != "" &&
!p.OrganogramType.Contains(organogramType) &&
p.OrganogramType != null
join r in this.Context.CmnCompanyCategories
on p.CompanyCategoryID equals r.CompanyCategoryID
join s in this.Context.CmnCompanyReferences on p.RefID equals s.RefID
join t in this.Context.CmnPartnerDetails on p.PartnerID equals t.PartnerID)
select new Foo {
Company = p,
CompanyReference = s,
PartnerDetails = t
};
次に、式を変更します(プロパティ名が元のプロパティ名と一致する場合は、プロパティ名の指定をスキップできます)。
public Expression<Func<Foo, dynamic>> SelectSearchColumns = (f) => new
{
f.Company.CompanyID,
f.Company.CompanyName,
f.PartnerDetail.PartnerName,
f.Company.OrganogramType,
f.Company.ParentID,
f.Company.InceptionDate,
f.CompanyReference.RefName,
};
そして、射影を行います(リストに変換されたときにのみクエリが実行されます):
return query.Select(SelectSearchColumns).ToList();
SQLプロファイラーを実行すると、式で選択された列のみがデータベースから返されることがわかります。
于 2013-02-17T08:25:27.983 に答える