【问题标题】:Dynamic Linq not working - Select not being applied动态 Linq 不工作 - 选择未应用
【发布时间】:2016-07-01 06:42:41
【问题描述】:

我尝试了几种可能性,并对博客和 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.() 并返回所有公司。

不工作,因为返回所有公司。不应用 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/Companies/Test/name=somename&isCustomer=True api/公司/测试/isCustomer=True&isSupplier=True api/Companies/Test/name=somename&email=someemail

任何高尚的开发者愿意帮助一个新的程序员?

最好的问候 威尔逊

【问题讨论】:

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


    【解决方案1】:

    您是否尝试将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 实例。

    【讨论】:

    • 谢谢你,多么简单的错误……我忘记分配变量了……经过这个 12 小时的马拉松,我肯定需要休息一下
    【解决方案2】:

    它不工作的原因是你在做的时候:

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

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

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

    然后在最后你返回查询。然后,一旦您加载结果,它就会包含您的所有修改。

    【讨论】:

    • 谢谢我在上面的答案中提到我累了忘记分配变量。我还是不敢相信。
    • 两个答案都是正确的,是否可以将两个都标记为正确?
    猜你喜欢
    • 2013-05-07
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多