C# 如果不为null,则追加到查询
我仍在努力学习.NETMVC,到目前为止,这里的每个人都提供了帮助,这位新手对此表示赞赏 当我提交表单时,用户可以选择仅在设置的类别或子类别中搜索。现在我已经设置了表单,因此每个复选框都有相同的名称,即:C# 如果不为null,则追加到查询,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我仍在努力学习.NETMVC,到目前为止,这里的每个人都提供了帮助,这位新手对此表示赞赏 当我提交表单时,用户可以选择仅在设置的类别或子类别中搜索。现在我已经设置了表单,因此每个复选框都有相同的名称,即: <input type="checkbox" name="category" value="Category Name" /> 这将创建一个逗号分隔的数组,其中包含已检查的值 现在,当我进入控制器中的查询部分时,我首先检查数组是否为null或长度是否为0,即: if ((cate
<input type="checkbox" name="category" value="Category Name" />
这将创建一个逗号分隔的数组,其中包含已检查的值
现在,当我进入控制器中的查询部分时,我首先检查数组是否为null或长度是否为0,即:
if ((category != null) || (category.Count() > 0))
现在我的问题是如何检查查询中的每个类别?意思是:
string[] category
var results = db.Employees.Join(db.Category, e => e.ID, c => c.EmployeeID, (e, c) => new { e = e, c = c }).Where(c => c.Name.Equals(category1) || c.Name.Equals(category2));
是否可以像在C#/.Net MVC中构建字符串一样构建完整查询?您可以使用
IEnumerable
的.Contains()
方法,以便对每个类别检查名称是否包含在提供的类别列表中
如果在类别
数组中有类别,则可以将查询更新为:
var results = db.Employees.Join(db.Category, e => e.ID, c => c.EmployeeID, (e, c) => new { e = e, c = c })
.Where(c => category.Contains(c.Name));
您可以使用
IEnumerable
的.Contains()
方法,这样对于每个类别,它将检查名称是否包含在提供的类别列表中
如果在类别
数组中有类别,则可以将查询更新为:
var results = db.Employees.Join(db.Category, e => e.ID, c => c.EmployeeID, (e, c) => new { e = e, c = c })
.Where(c => category.Contains(c.Name));
计划在集合中搜索时,为类别名称创建一个
Hashset
,如下所示:
var categoryHashset = new HashSet<string> {"","Category2",..,"CategoryN"};
Or
var categoryHashset = new HashSet<string>(CategoryList);
您的查询将变成:
var results = db.Employees.Join(db.Category, e => e.ID, c => c.EmployeeID, (e, c) => new { e = e, c = c })
.Where(c => categoryHashset.Contains(c.Name));
计划在集合中搜索时,为类别名称创建一个
Hashset
,如下所示:
var categoryHashset = new HashSet<string> {"","Category2",..,"CategoryN"};
Or
var categoryHashset = new HashSet<string>(CategoryList);
您的查询将变成:
var results = db.Employees.Join(db.Category, e => e.ID, c => c.EmployeeID, (e, c) => new { e = e, c = c })
.Where(c => categoryHashset.Contains(c.Name));
谢谢我想我是想得太多了,因为category是一个数组。标准的
IEnumerable
Contains不是为搜索而优化的,它执行O(N)线性搜索,理想的数据结构,如Hashset、Dictionary、LookUp
是为快速O(1)搜索而设计的。我想我是想得太多了,因为类别是一个数组。标准的IEnumerable
Contains没有针对搜索进行优化,它进行O(N)线性搜索,理想的数据结构,如Hashset、Dictionary、LookUp
是为了快速O(1)搜索。最后,我得到了这个错误:{“LINQ to Entities无法识别方法‘Boolean Contains[String](System.Collections.Generic.IEnumerable1[System.String],System.String,System.Collections.Generic.IEqualityComparer1[System.String]),此方法无法转换为存储表达式。”}
对于我计算总结果时的部分。请在不使用StringComparer的情况下使用。OrdinalIgnoreCase
,这一部分需要一个扩展方法,我将简要更新。请检查更新的版本,我意识到对于哈希集
,因为它创建了唯一的哈希
,甚至大小写都很重要,因此使用>StringComparer
,将不允许它保持O(1),因为我必须使用任何运算符进行扫描,因此使其O(N)看起来像是搜索正在工作,因为结果与直接查询匹配。非常感谢!Hi Mrinal,我收到了以下错误:{“LINQ to Entities无法识别方法的布尔包含[String](System.Collections.Generic.IEnumerable1[System.String],System.String,System.Collections.Generic.IEqualityComparer1[System.String])方法,此方法无法转换为存储表达式。“}
对于我计算总结果时的部分。请在不使用StringComparer的情况下使用。OrdinalIgnoreCase
,这一部分需要一个扩展方法,我将简要更新。请检查更新的版本,我意识到对于哈希集
,因为它创建了唯一的哈希
,甚至大小写都很重要,因此使用>StringComparer
,将不允许它保持O(1),因为我必须使用任何运算符进行扫描,因此使其O(N)看起来像搜索正在工作,因为结果与直接查询匹配。非常感谢!