Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态Linq不工作-选择未应用_C#_Linq_Dynamic_Asp.net Web Api_Iqueryable - Fatal编程技术网

C# 动态Linq不工作-选择未应用

C# 动态Linq不工作-选择未应用,c#,linq,dynamic,asp.net-web-api,iqueryable,C#,Linq,Dynamic,Asp.net Web Api,Iqueryable,我尝试了几种可能性,并对博客和stackoverflow的答案进行了适当的研究。可能是我,但我就是不能让这个动态linq查询工作 我在一个WebAPI项目上有一个控制器,定义了以下投影和路由 private static readonly Expression<Func<Company, CompanyLightListDTO>> AsCompanyLightListDTO = x => new CompanyLightListDTO { Name = x.Na

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

我在一个WebAPI项目上有一个控制器,定义了以下投影和路由

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 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/companys/Test/name=somename&isCustomer=True api/companys/Test/isCustomer=True和isSupplier=True api/companys/Test/name=somename&email=someemail

有没有哪位高尚的开发人员愿意帮助一位新的代码编写人员完成这项工作

致意
DWilson

您是否尝试将
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));
IQueryable查询=db.companys;
如果(!String.IsNullOrEmpty(名称))
query=query.Where(c=>c.Name.Contains(Name));
如果(!String.IsNullOrEmpty(电子邮件))
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));

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

谢谢,这是一个多么简单的错误。。。我忘记分配变量了。。在12小时的马拉松之后,我确实需要休息一下。谢谢你,我在上面的回答中提到,我很累,忘记分配变量了。我还是不相信。两个答案都是正确的,有可能把两个都标为正确吗?
query = query.Where(c => c.Name.Contains(name));