2013-02-17 39 views
0

在我的項目一個表有兩個或多個表連接,需要想出來放需要加入他們的行列,加入是不是我的問題,之後加入要選擇所需的列,但由分離的表情,像波紋管語法:在加盟如何分隔select語句

public IEnumerable GetParent(string organogramType = "") 
{ 
    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(SelectSearchColumns).ToList(); 
    return query; 
} 
public Expression<Func<CmnCompany, CmnCompanyReference, CmnPartnerDetail, dynamic>> SelectSearchColumns = (p, r,t) => new 

{ 
    CompanyID = p.CompanyID, 
    CompanyName=p.CompanyName, 
    PartnerName=t.PartnerName, 
    OrganogramType=p.OrganogramType, 
    ParentID=p.ParentID, 
    InceptionDate=p.InceptionDate, 
    RefName=r.RefName, 
}; 
  1. 想從我的波紋管LINQ語法分隔select語句

  2. 的方法基地parameter=organogramType選擇列名稱將改變 假設organogramType (Company, office, departmentName) office 然後選擇columnn 「CompanyName 「將CHAGE與Office,如何在運行時恰克列名

顯示我的錯誤信息:查詢體必須與SELECT子句或group子句

如果結束有任何疑問,請在先進

回答

1

你不能這樣做,謝謝,因爲你的表達需要三個參數,但查詢你總是收到一個參數(這是序列類型)。此外,您的查詢需要選擇後聲明最後加入消除你現在看到的錯誤。因此,技術上可以創建類型,它包含三個對象:

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事件探查器,您將會看到只有在表達式中選擇的列從數據庫中返回。

+0

lazyberezovsky,感謝您的回覆,還有剩下的一個問題是,它可以在SELECT語句中使用if。 – shamim 2013-02-17 08:41:59

+0

如果(organogramType!= 「」){公司名稱= p.CompanyName,}否則{DepartmentName的= p.CompanyName,},如果你想在你的匿名類型有條件地選擇不同的屬性 – shamim 2013-02-17 08:43:14

+0

@shamim,然後沒了,這是不可能的。你所能做的就是通過三元運算符'?:'爲屬性賦值。像這樣'Name = p.IsDepartment? p.DepartmentName:p.CompanyName' – 2013-02-17 08:43:47