动态Linq无法正常工作 - 选择未应用

时间:2016-03-15 17:12:41

标签: c# linq dynamic asp.net-web-api iqueryable

我尝试了几种可能性,并对stackoverflow上的博客和答案进行了适当的研究。它可能是我,但我无法让这个动态的linq查询工作。

我在Web Api项目上有一个控制器,其中定义了以下投影和路线。

private static readonly Expression<Func<Company, CompanyLightListDTO>> AsCompanyLightListDTO = x => new CompanyLightListDTO
{
  Name = x.Name,
  Id = x.Id
};

[Route("Test")]
[ResponseType(typeof(CompanyLightListDTO))]
public IQueryable<CompanyLightListDTO> GetTest(string name=null, string 
email=null, bool? isSupplier=null, bool? isCustomer=null)
{
  IQueryable<Company> query = db.Companies;
  if (!String.IsNullOrEmpty(name))
    query.Where(c => c.Name.Contains(name));

  if (!String.IsNullOrEmpty(email))
    query.Where(c => c.Email.Contains(email));

  if (isSupplier.HasValue)
    query.Where(c => c.isSupplier.Equals(isSupplier));

  if (isCustomer.HasValue)
    query.Where(c => c.isCustomer.Equals(isCustomer));

  // Return ??
}

我已经尝试了几次退货。所有这些都忽略了之前的所有。()并返回所有公司。

  

不工作,因为退回所有公司。 Where子句不适用

return query.Include(c => c.Name).Select(AsCompanyLightListDTO);
return query.Select(AsCompanyLightListDTO);

我唯一可以使用此方法的方法是

return db.Companies.Include(c => c.Name)
  .Where(c => c.Name.Contains(name)
    && c.Email.Contains(email)
    && c.isSupplier.Equals(isSupplier)
    && c.isCustomer.Equals(isCustomer))
  .Select(AsCompanyLightListDTO);

但我希望有一个动态的linq查询,以便我可以进行这些类型的调用:

  

API /公司/测试/名称= somename&安培; isCustomer =真   API /公司/测试/ isCustomer =真放; isSupplier =真   API /公司/测试/名称= somename&安培;电子邮件= someemail

任何愿意帮助新编码员的高级开发人员?

祝你好运 DWilson

2 个答案:

答案 0 :(得分:2)

您是否尝试将GetTest替换为此?

IQueryable<Company> query = db.Companies;
if (!String.IsNullOrEmpty(name))
    query = query.Where(c => c.Name.Contains(name));

if (!String.IsNullOrEmpty(email))
    query = query.Where(c => c.Email.Contains(email));

if (isSupplier.HasValue)
    query = query.Where(c => c.isSupplier.Equals(isSupplier));

if (isCustomer.HasValue)
    query = query.Where(c => c.isCustomer.Equals(isCustomer));

Queryable方法(SelectWhere等)重新开始新IQueryable个实例。

答案 1 :(得分:0)

它无法正常工作的原因是:

query.Where(c => c.Name.Contains(name));

它实际上并没有将它分配回IQueryable。 IQueryable是延迟加载,这意味着在迭代结果或调用ToList()或其他东西之前它实际上并不运行查询。因此,每次修改查询变量时,都不会保存修改它的内容。要解决这个问题,您只需要这样做:

query = query.Where(c => c.Name.Contains(name));

然后在最后返回查询。然后,一旦你加载结果,它应该有你所有的修改。