2013-11-02 27 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();