0
4

1 に答える 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 に答える