2012-10-30 79 views
0

在我的示例中,我想獲取促銷代碼名稱的促銷元素,如果未提供名稱,則提供促銷代碼名稱,然後採取所有可用的促銷活動。執行LINQ帶或不帶where條款

var result = from row in promoCodes.AsEnumerable() 
      where (
       !String.IsNullOrEmpty(fieldTitle) && 
       !String.IsNullOrEmpty(filterValue) && 
       row[fieldTitle].Equals(filterValue) 
      ) || true 
      select new PromoCodeInfoContainer 
      { 
       BannerLink = row["BannerLink"] as string 
       .... 
      }; 

我試圖遵循SQL技術,如果沒有提供條件,那麼OR將是任何不會影響選擇(|| true)的東西。在linq中,這不起作用,它總是返回所有條目,而不管「fieldTitle」和「filterValue」是否爲空。任何人都可以提出一個正確的方法來做到這一點?

+7

好,'||真正'看起來是一個很好的理由,以返回每一行... –

+0

是@MarcGravell這就是問題 –

+1

我會說兩個語句,一個檢查促銷元素,然後第二個如果沒有找到。它會更容易閱讀和簡單。 –

回答

2

首先,刪除|| true - 這將返回每一行,總是 - 因此問題。

一個不錯的方法,這樣做會構成 - 這就避免了需要測試fieldTitle/fieldValue的每一行,當他們有值,或做任何事情太多可言每行,如果他們是空白:

var query = promoCodes.AsEnumerable(); 
if(!string.IsNullOrEmpty(fieldTitle) && !string.IsNullOrEmpty(fieldValue)) 
{ 
    query = from row in query 
      where filterValue.Equals(row[fieldTitle]) 
      select row; 
} 
var result = from row in query 
      select new PromoCodeInfoContainer {...} 

注意我還顛倒了Equals,以便我們知道不是null的東西在左邊;儘管取決於數據類型,但可能更優選Equals(x,y)x == y

1
var result = from row in promoCodes.AsEnumerable() 
      where String.IsNullOrEmpty(fieldTitle) ||     
        String.IsNullOrEmpty(filterValue) || 
        row[fieldTitle].Equals(filterValue) 
      select new PromoCodeInfoContainer 
      { 
       BannerLink = row["BannerLink"] as string 
      }; 

如果filterValuefieldTitle爲空或空,則行過濾將不被執行。

另一種選擇(我想流暢的界面看起來更好地在這裏):

var query = promoCodes.AsEnumerable(); 

if (!String.IsNullOrEmpty(fieldTitle) && !String.IsNullOrEmpty(fieldValue)) 
    query = query.Where(row => row[fieldTitle].Equals(filterValue)); 

var result = query.Select(row => new PromoCodeInfoContainer { ... });