2013-11-02 26 views
0

運算符應該是'AND'而不是'OR'。如何將多部分linq合併爲一個查詢?

我試圖重構下面的代碼,我明白寫LINQ查詢的下列方式可能不是正確的方法。可以somone建議我如何將以下內容合併爲一個查詢。

 AllCompany.Where(itm => itm != null).Distinct().ToList(); 

     if (AllCompany.Count > 0) 
     { 
      //COMPANY NAME 
      if (isfldCompanyName) 
      { 
       AllCompany = AllCompany.Where(company => company["Company Name"].StartsWith(fldCompanyName)).ToList(); 
      } 
      //SECTOR 
      if (isfldSector) 
      { 
       AllCompany = AllCompany.Where(company => fldSector.Intersect(company["Sectors"].Split('|')).Any()).ToList(); 
      } 
      //LOCATION 
      if (isfldLocation) 
      { 
       AllCompany = AllCompany.Where(company => fldLocation.Intersect(company["Location"].Split('|')).Any()).ToList(); 

      } 
      //CREATED DATE 
      if (isfldcreatedDate) 
      { 
       AllCompany = AllCompany.Where(company => company.Statistics.Created >= createdDate).ToList(); 
      } 
      //LAST UPDATED DATE 
      if (isfldUpdatedDate) 
      { 
       AllCompany = AllCompany.Where(company => company.Statistics.Updated >= updatedDate).ToList(); 
      } 

      //Allow Placements 
      if (isfldEmployerLevel) 
      { 
       fldEmployerLevel = (fldEmployerLevel == "Yes") ? "1" : ""; 

       AllCompany = AllCompany.Where(company => company["Allow Placements"].ToString() == fldEmployerLevel).ToList(); 
      } 
+0

不要加'ToList()'在每行,只在最後一個,這它將只有一個大的查詢,只有一個調用db。你現在可以把它寫在一行上,或者是現在寫的。 – Rudy

回答

0

如何試圖這樣;

AllCompany = AllCompany .Where(company => (company => company.Statistics.Created >= createdDate)) && (company.Statistics.Updated >= updatedDate)); 

如果查詢的每個部分都是可選的(如創建日期,最後更新日期..)然後就可以構建LINQ查詢字符串。

2

首先,除非AllCompany是一些神奇的自定義類型,第一行給你什麼。 另外我懷疑Distinct的工作方式你想要它。我不知道AllCompany的類型,但我猜想它只給你參考的區別。

不管怎樣here'w我想你想:

fldEmployerLevel = (fldEmployerLevel == "Yes") ? "1" : ""; 

var result = AllCompany.Where(itm => itm != null) 
    .Where(company => !isfldCompanyName || company["Company Name"].StartsWith(fldCompanyName)) 
    .Where(company => !isfldSector|| fldSector.Intersect(company["Sectors"].Split('|')).Any()) 
    .Where(company => !isfldLocation|| fldLocation.Intersect(company["Location"].Split('|')).Any()) 
    .Where(company => !isfldcreatedDate|| company.Statistics.Created >= createdDate) 
    .Where(company => !isfldUpdatedDate|| company.Statistics.Updated >= updatedDate) 
    .Where(company => !isfldEmployerLevel|| company["Allow Placements"].ToString() == fldEmployerLevel) 
    .Distinct() 
    .ToList(); 

編輯:

我搬到Distinct到查詢的尾部優化處理。

0

這裏有一個鬼鬼祟祟的伎倆。如果您在自己的靜態類定義了以下擴展方法:

public virtual IEnumerable<T> WhereAll(params Expression<Predicate<T> filters) 
{ 
    return filters.Aggregate(dbSet, (acc, element) => acc.Where(element)); 
} 

,那麼你可以寫

var result = AllCompany.WhereAll(itm => itm != null, 
    company => !isfldCompanyName || company["Company Name"].StartsWith(fldCompanyName), 
    company => !isfldSectorn || fldSector.Intersect(company["Sectors"].Split('|')).Any(), 
    company => !isfldLocation || fldLocation.Intersect(company["Location"].Split('|')).Any(), 
    company => !isfldcreatedDate || company.Statistics.Created >= createdDate, 
    company => !isfldUpdatedDate || company.Statistics.Updated >= updatedDate, 
    company => !isfldEmployerLevel || company["Allow Placements"].ToString() == fldEmployerLevel) 
    .Distinct() 
    .ToList();