DataTable,多个搜索词,多列
DataTable, multiple search terms, multiple columns
我有几个搜索词必须与数据库(现有的 Access 数据库)的几个字段匹配,返回匹配所有词的任何记录,无论哪个字段匹配哪个词。
假设搜索词是:'John, Boston' 和 'London',目标字段是 'name, surname' 和 'city'。
我必须找到两个:一个叫 'John Boston from London' 的男人和一个叫 'John London from Boston'
的男人
据我所知:
string initialQuery = "SELECT * FROM clientTable WHERE name like '%firstTerm%' or surname like '%firstTerm%' or city like '%firstTerm%'";
var queryDs = new DataSet();
OleDbDataAdapter clientesDa;
OleDbConnection con = CreateOleDbConnection();
clientesDa = new OleDbDataAdapter(initialQuery, con);
clientesDa.Fill(queryDs, tableName);
DataTable resultDataTable = queryDs.Tables["clientTable"];
DataRow[] clientes = resultDataTable.Select("name like '%secondTerm%' or surname like '%secondTerm%' or city like '%secondTerm%'");
我不知道如何进一步过滤结果 Datarow[]
而且我想一定有更好的方法来做到这一点。
只用SQL可以吗?
可以用连续的 LINQ 过滤器来完成吗?
在 C# 中如何实现?
添加为另一个答案,由于评论大小限制:
我现在必须处理另一个问题,但对您的问题最简单的回答是:让数据库为您工作。这就是它们的设计目的。你超越了一个 initialQuery
使问题过于复杂——你的 整个 查询可以通过 使用 C# 构建一个适当的查询字符串来解决:
SELECT DISTINCT blah blah blah -- what data you want?
FROM some_tables -- where do you want it from?
WHERE important stuff here -- THIS IS YOUR QUESTION!!!
IOW,您最好在这里做的是构建 单个 SQL 查询,其中包含一个复合 WHERE 子句,该子句反映将结果集限制为您实际需要的参数。
记住:
SQL 是一种面向集合的语言。
C#/C++/Java/most 您将专业处理的其他语言是 DECLARITIVE/OO 语言。
这是一个重要的区别。它们不仅面向不同的问题,而且存在于完全不同的问题领域。
您在 SQL 中 的问题很简单。一个查询,带有适当的 WHERE
子句和条件。就是这样。
然而,在 C# 等语言中,它变成了一个更困难的问题——我们实际上必须 创建 那些 "appropriate" WHERE 子句和条件。所有这些都让我们回到第一点,稍微改写一下:让 语言 为你工作。在 SQL、 给定适当的查询字符串 中搜索数据库非常棒。实际上 构建 SQL 中的那些查询字符串很糟糕。在 C# 中不是这样,反之亦然。
因此,利用您在大多数工作中使用的语言的优势。在您的情况下,我们似乎在谈论 C#。
所以:您希望 SQL 查询看起来像什么?使用 C# 构建它,然后执行它以获得所需的结果集。
一个查询,构造得当。 C# 构建它,然后使用 DB 引擎实际执行它(注意:无论是 Access、MS-SQL 都无所谓 - 让 ODBC 来处理这个问题)。
作为给定示例的起点,考虑您可能想要生成(使用 C#)以下字符串(主要是伪代码,再次脱离我的头脑):
SELECT -- well, you want some data, right?
DISTINCT -- you don´t want to dup *every* record matching the WHERE clause
* -- your code assumes you want *all* fields for a matching record
FROM clientTable -- you only specified one table to search
WHERE -- now HERE´s the part that matters:
(
name LIKE %firstTerm%
OR name LIKE %secondTerm%
OR name LIKE %thirdTerm%
)
OR
(
surname LIKE %firstTerm%
OR surname LIKE %secondTerm%
OR surname LIKE %thirdTerm%
)
OR
(
city LIKE %firstTerm%
OR city LIKE %secondTerm%
OR city LIKE %thirdTerm%
)
还有其他几种 (better/cleaner/expert) 方法可以做到这一点,但这通常是最基本的方面:您需要创建什么查询字符串来满足您的要求?作为奖励,这种方法(保持数据库在数据库领域中工作)通常比创建数据子集、将它们查询到另一个子集等快得多。一个查询(只要可能),具有多个 WHERE 子句可以比创建和 repeatedly/recursively 查询临时数据集快几个数量级。
警告:none 的即兴代码可能会按原样工作。仅供说明之用。在我出门的路上发布。
我有几个搜索词必须与数据库(现有的 Access 数据库)的几个字段匹配,返回匹配所有词的任何记录,无论哪个字段匹配哪个词。
假设搜索词是:'John, Boston' 和 'London',目标字段是 'name, surname' 和 'city'。
我必须找到两个:一个叫 'John Boston from London' 的男人和一个叫 'John London from Boston'
的男人据我所知:
string initialQuery = "SELECT * FROM clientTable WHERE name like '%firstTerm%' or surname like '%firstTerm%' or city like '%firstTerm%'";
var queryDs = new DataSet();
OleDbDataAdapter clientesDa;
OleDbConnection con = CreateOleDbConnection();
clientesDa = new OleDbDataAdapter(initialQuery, con);
clientesDa.Fill(queryDs, tableName);
DataTable resultDataTable = queryDs.Tables["clientTable"];
DataRow[] clientes = resultDataTable.Select("name like '%secondTerm%' or surname like '%secondTerm%' or city like '%secondTerm%'");
我不知道如何进一步过滤结果 Datarow[]
而且我想一定有更好的方法来做到这一点。
只用SQL可以吗?
可以用连续的 LINQ 过滤器来完成吗?
在 C# 中如何实现?
添加为另一个答案,由于评论大小限制:
我现在必须处理另一个问题,但对您的问题最简单的回答是:让数据库为您工作。这就是它们的设计目的。你超越了一个 initialQuery
使问题过于复杂——你的 整个 查询可以通过 使用 C# 构建一个适当的查询字符串来解决:
SELECT DISTINCT blah blah blah -- what data you want?
FROM some_tables -- where do you want it from?
WHERE important stuff here -- THIS IS YOUR QUESTION!!!
IOW,您最好在这里做的是构建 单个 SQL 查询,其中包含一个复合 WHERE 子句,该子句反映将结果集限制为您实际需要的参数。
记住:
SQL 是一种面向集合的语言。
C#/C++/Java/most 您将专业处理的其他语言是 DECLARITIVE/OO 语言。
这是一个重要的区别。它们不仅面向不同的问题,而且存在于完全不同的问题领域。
您在 SQL 中 的问题很简单。一个查询,带有适当的 WHERE
子句和条件。就是这样。
然而,在 C# 等语言中,它变成了一个更困难的问题——我们实际上必须 创建 那些 "appropriate" WHERE 子句和条件。所有这些都让我们回到第一点,稍微改写一下:让 语言 为你工作。在 SQL、 给定适当的查询字符串 中搜索数据库非常棒。实际上 构建 SQL 中的那些查询字符串很糟糕。在 C# 中不是这样,反之亦然。
因此,利用您在大多数工作中使用的语言的优势。在您的情况下,我们似乎在谈论 C#。
所以:您希望 SQL 查询看起来像什么?使用 C# 构建它,然后执行它以获得所需的结果集。
一个查询,构造得当。 C# 构建它,然后使用 DB 引擎实际执行它(注意:无论是 Access、MS-SQL 都无所谓 - 让 ODBC 来处理这个问题)。
作为给定示例的起点,考虑您可能想要生成(使用 C#)以下字符串(主要是伪代码,再次脱离我的头脑):
SELECT -- well, you want some data, right?
DISTINCT -- you don´t want to dup *every* record matching the WHERE clause
* -- your code assumes you want *all* fields for a matching record
FROM clientTable -- you only specified one table to search
WHERE -- now HERE´s the part that matters:
(
name LIKE %firstTerm%
OR name LIKE %secondTerm%
OR name LIKE %thirdTerm%
)
OR
(
surname LIKE %firstTerm%
OR surname LIKE %secondTerm%
OR surname LIKE %thirdTerm%
)
OR
(
city LIKE %firstTerm%
OR city LIKE %secondTerm%
OR city LIKE %thirdTerm%
)
还有其他几种 (better/cleaner/expert) 方法可以做到这一点,但这通常是最基本的方面:您需要创建什么查询字符串来满足您的要求?作为奖励,这种方法(保持数据库在数据库领域中工作)通常比创建数据子集、将它们查询到另一个子集等快得多。一个查询(只要可能),具有多个 WHERE 子句可以比创建和 repeatedly/recursively 查询临时数据集快几个数量级。
警告:none 的即兴代码可能会按原样工作。仅供说明之用。在我出门的路上发布。