动态 Linq 不工作 - Select 未应用
Dynamic Linq not working - Select not being applied
我尝试了几种可能性,并对博客进行了适当的研究,并在 Whosebug 上进行了解答。可能是我,但我无法让这个动态 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 ??
}
我已经尝试了几次 return。所有这些都忽略了之前的所有 where.() 和 return all Companies.
not working because return all companies. The Where clauses are not applied
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/Companies/Test/isCustomer=True&isSupplier=True
api/Companies/Test/name=somename&email=someemail
有高尚的开发人员愿意帮助新的编码员吗?
此致
德威尔逊
您是否尝试将 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
方法(Select
、Where
等)返回新的 IQueryable
实例。
它不起作用的原因是你在做什么:
query.Where(c => c.Name.Contains(name));
它实际上并没有将它分配回 IQueryable。 IQueryable 是延迟加载的,这意味着它实际上不是 运行 查询,直到您遍历结果或调用 ToList() 或其他东西。因此,每次修改查询变量时,都不会保存修改后的内容。要解决这个问题,您只需要做:
query = query.Where(c => c.Name.Contains(name));
然后在最后你return查询。然后一旦你加载结果它应该有你的所有修改。
我尝试了几种可能性,并对博客进行了适当的研究,并在 Whosebug 上进行了解答。可能是我,但我无法让这个动态 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 ??
}
我已经尝试了几次 return。所有这些都忽略了之前的所有 where.() 和 return all Companies.
not working because return all companies. The Where clauses are not applied
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/Companies/Test/isCustomer=True&isSupplier=True api/Companies/Test/name=somename&email=someemail
有高尚的开发人员愿意帮助新的编码员吗?
此致 德威尔逊
您是否尝试将 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
方法(Select
、Where
等)返回新的 IQueryable
实例。
它不起作用的原因是你在做什么:
query.Where(c => c.Name.Contains(name));
它实际上并没有将它分配回 IQueryable。 IQueryable 是延迟加载的,这意味着它实际上不是 运行 查询,直到您遍历结果或调用 ToList() 或其他东西。因此,每次修改查询变量时,都不会保存修改后的内容。要解决这个问题,您只需要做:
query = query.Where(c => c.Name.Contains(name));
然后在最后你return查询。然后一旦你加载结果它应该有你的所有修改。