2012-07-10 74 views
1

我有一個連接兩個表的LINQ表達式。我想有條件地檢查其他布爾值:(通知文本之間的低於*********Linq的條件表達式

bool status = testfunc(); 

var List = 
    from t in Houses 
    join k in Tbl_HouseOwner on t.HouseCode equals k.HouseCode 
    where k.ReqCode== t.ReqCode 
    *********** if (status) { where k.Name.Contains(Name) } ********** 
    select new 
    { 
     ... 
     name = k.Name, 
     ... 
    }; 

回答

7

您可以使用status掩蓋病情,像這樣:

where k.ReqCode == t.ReqCode && (!status || k.Name.Contains(Name)) 

如果statusfalse, OR ||將立即成功,AND &&將成立(假設我們必須評估OR ||,AND的左側210一定是真的)。另一方面,如果statustrue,則需要評估k.Name.Contains(Name)以完成條件評估。

3

dasblinkenlight的答案(應該可以正常工作)的替代選項是以編程方式構建查詢。在這種情況下你有效地改變聯接的右側,所以你可以使用:

IQueryable<Owner> owners = Tbl_HouseOwner; 
if (status) 
{ 
    owners = owners.Where(k => k.Name.Contains(Name)); 
} 

然後:

var query = from t in Houses 
      join k in owners on t.HouseCode equals k.HouseCode 
      where k.ReqCode == t.ReqCode 
      select new { ... }; 

哪種方法最適合取決於您的方案。如果您想要添加各種不同的查詢過濾器,以編程方式構建它可以變得更清晰 - 並使任何給定查詢的最終SQL更易於理解。對於一次性,dasblinkenlight的方法更簡單。

還要注意的是,在LINQ到對象至少,這將是更有效的加入對列:

var query = from t in Houses 
      join k in owners 
      on new { t.HouseCode, t.ReqCode } equals new { k.HouseCode, k.ReqCode } 
      select new { ... }; 

在LINQ的任何味道它轉換爲SQL,我期望這儘管如此,仍然可以通過數據庫或查詢翻譯進行優化。

1

我做這種方式:

 IQueryable<X> r = from x in Xs 
            where (x.Status == "Active") 
            select x; 
     if(withFlagA) { 
      r = r.Where(o => o.FlagA == true); 
     } 

爲了適應到您的示例,首先你可以這樣做:

IQueryable<YourOwnerType> filteredOwners = Tbl_HouseOwner; 
if(status) { 
    filteredOwners = filteredOwners.Where(o => o.Name.Contains(Name)); 
} 

則替換Tbl_HouseOwnerfilteredOwners

var List = 
from t in Houses 
join k in filteredOwners on t.HouseCode equals k.HouseCode 
where k.ReqCode== t.ReqCode 
//Nothing here 
select new 
{ 
    ... 
    name = k.Name, 
    ... 
}; 

現在,你可能知道這一點,但這裏的關鍵是,初始。凡「伸手」到數據庫中。您的查詢在您開始枚舉之前(例如foreach)或者調用方法如ToList(),First(),FirstOrDefault()。這意味着您可以撥.Where在您的選擇之後,如果您願意並且最終查詢仍然有效。