【问题标题】:C# IQueryable not workingC# IQueryable 不工作
【发布时间】:2016-12-15 11:55:32
【问题描述】:

我有一个findAll 函数,它从数据库中的Contacts 表中获取所有记录,然后根据用户在搜索表单中选择的值过滤它们。结果一次过滤一个过滤器。

IQueryable<Contact> resultContacts = db.Contacts;

if(request['Name'] != "")
{
   resultContacts = resultContacts.Where(a => a.Name.Contains(Name));
}

if(request['Phone'] != "")
{
   resultContacts = resultContacts.Where(a => a.Phone.Equals(Phone));
}

if(request['Company'] != "")
{
   resultContacts = resultContacts.Where(a => a.Company.Contains(Company));
}

return resultContacts;

问题是现在这不起作用。由于某种原因,每个if 中的resultContacts.Where 正在重置为我在第一行的原始resultContacts。例如:当我调试时,更改适用于第一个 if(我最终得到 100 条记录中的 10 条),但是当我进入第二个 if 时,代码正在查询原始 resultContacts,而不是我拥有的 10由于第一个if

这在 2 周前之前运行良好一年多。我不知道我的代码是否发生了变化……如果我添加了引用或进行此更改的内容。

知道为什么吗? 谢谢!

【问题讨论】:

  • 您的意思是在每个查询中都使用请求对象吗?喜欢.Contains(request['Name']));
  • 我很惊讶 C# 允许这种语法 request['Phone'] 单引号包含 char 而不是 string
  • 另外,request['Name']Name 不同。 PhoneCompany 同上。不要放置有点像你所拥有的代码。发布真实代码。
  • 我实际上是将请求变量传递给字符串变量。我只是在示例中使用了“请求”对象来说明清楚。

标签: c# sql .net linq iqueryable


【解决方案1】:
var results = db.Contacts
    .Where(a => request["Company"] == String.Empty || a.Company.Contains(Company))
    .And(a => request["Phone"] == String.Empty || a.Phone.Equals(Phone))
    .And(a => request["Name"] == String.Empty || a.Name.Contains(Name)));

【讨论】:

  • 您可以将所有 3 个条件统一到 Where 子句中,对吗?这似乎有效,只是想确保我理解它。
  • 是的,我想你可以。
  • 对你的答案给出一些解释,而不仅仅是一些代码。我不明白 OP 代码和这个代码之间的行为差​​异。对我来说,他们应该以同样的方式工作......
猜你喜欢
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
相关资源
最近更新 更多