Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# 我希望从数组中选择包含任何元素的所有行_C#_Sql - Fatal编程技术网

C# 我希望从数组中选择包含任何元素的所有行

C# 我希望从数组中选择包含任何元素的所有行,c#,sql,C#,Sql,我正在尝试做一个搜索引擎,比如stackoverflow。我需要选择包含任何选定标记的所有行 桌子 然后我的sql select语句如下 Select * from table where Tags like myTags[] 我希望有这样的结果 RowID Question Tags 1 'who' 'C#' 3 'where' 'C#,PHP' 4 'when' 'PHP,SQL' 当然,我知道这在语法上

我正在尝试做一个搜索引擎,比如stackoverflow。我需要选择包含任何选定标记的所有行

桌子

然后我的sql select语句如下

Select * from table where Tags like myTags[]
我希望有这样的结果

RowID    Question    Tags
  1        'who'     'C#'
  3       'where'    'C#,PHP'
  4       'when'     'PHP,SQL'

当然,我知道这在语法上是不正确的,这就是我在这里的原因。

你反对多次调用SQL吗?如果没有,您可以执行for循环,为标记数组中的每个项运行查询?

Linq版本:

myTable.Where(x=>myTags.Contains(x.Tag));
Sql版本:

Select * from table where Tag in {'c#','SQL','PHP'}
如果一个项目可能有太多的标记,您应该在添加关系表的数据库设计中稍作更改,这不是一个包含太多标记的字符串的好方法

更新: 对于当前的DB示例,您可以使用linq执行此操作:

myTable.Where(x=>myTags.Any(y=>x.Tags.Contains(y)));

你的意思是像“从myTable中选择*,其中myField位于1,2,3,4”这样的内容吗?如果我认为它不适用,我将稍微修改我的问题以说明原因。。。。我希望不要在一个字符串中存储多个标记。它与关系数据库应该是什么完全相反。有一个单独的表,每行有一个标记1,'C',2,'SQL',3,'C',3,'PHP',4,'PHP',4,'SQL'。在所有SQL反模式中,这是第一个要学习和避免的模式。[一行中的一个字段=一项数据。不是几项。]这很少是一个最佳选择。我在问问题之前尝试过这个方法。问题是它必须与标记完全匹配。我要去哪里玩外卡。我之所以需要它,是因为我将多个标记存储为字符串C、SQL、PHP'@K'Leg,请参阅我的更新,在我看来,您应该添加另一个表来区分一个项目中的不同标记。事实上,没有人将子项列表转换为字符串,这是低效的,而且不是正常的数据库设计。您的数据模型需要新表。使用类似的“%tag%”会非常慢,因为它会触发对每个查询的表扫描。@K'Leg-然后使用XML文本文件而不是关系数据库?@K'Leg-标准化表的优点是,通过索引标记字段,可以大大提高性能。这允许索引查找,而不是扫描整个表。对于单个字符串字段,您总是可以得到整个表的扫描。对于多个字段,您需要多个索引和复杂或多个查询。就设计、性能、可维护性、灵活性甚至简单性而言,标准化数据版本几乎总是一条必由之路。我的意思是,你需要一个极端的情况下,有任何机会,它不是正确的方式。
myTable.Where(x=>myTags.Any(y=>x.Tags.Contains(y)));