Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 如果不为null,则追加到查询_C#_Asp.net Mvc_Linq - Fatal编程技术网

C# 如果不为null,则追加到查询

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

我仍在努力学习.NETMVC,到目前为止,这里的每个人都提供了帮助,这位新手对此表示赞赏

当我提交表单时,用户可以选择仅在设置的类别或子类别中搜索。现在我已经设置了表单,因此每个复选框都有相同的名称,即:

<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)看起来像搜索正在工作,因为结果与直接查询匹配。非常感谢!