DataTable,多个搜索词,多列

时间:2015-01-07 05:30:57

标签: c# sql linq

我有几个搜索字词,我必须与数据库的几个字段(现有的Access数据库)匹配,返回任何匹配所有字词的记录,无论哪个字段与哪个字段匹配。

我们假设搜索词是:'John,Boston'和'London',目标字段是'name,surname'和'city'。

我必须找到两个:一个名叫'来自伦敦的约翰波士顿'和一个名叫'来自波士顿的约翰伦敦'的人

到目前为止,我已尝试过:

        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#中完成?

1 个答案:

答案 0 :(得分:0)

根据评论大小限制添加另一个答案:

我现在必须处理另一个问题,但对您的问题最简单的答案是:让数据库为您服务。这就是他们的设计目标。超过一个initialQuery使问题过于复杂 - 您的整个查询可以通过使用C#构建一个合适的查询字符串来解决:< / p>

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,你最好在这里做的是使用复合WHERE子句构建单个SQL查询,该子句反映了将结果集限制为你真正想要的的参数。

记住:

SQL是一种面向SET的语言 C#/ C ++ / Java /您将专业处理的大多数其他语言是DECLARITIVE / OO语言。

这是一个重要的区别。它们不仅针对不同的问题,而且存在于完全不同的问题

您的问题在SQL 中很简单。一个查询,具有适当的WHERE子句和条件。就是这样。

然而,在诸如C#之类的语言中,它变得更加困难 - 我们必须实际创建那些“适当的”WHERE子句和条件。所有这些都让我们回到第一点,稍微重新措辞:让语言为你工作。在SQL中搜索数据库,给出适当的查询字符串非常棒。实际上在SQL中构建那些查询字符串很糟糕。在C#中不是这样,反之亦然。

因此,使用您在中完成大部分工作的语言的优势。在你的情况下,似乎我们正在谈论C#。

那么:您希望SQL查询看起来像什么?使用C#构建它,然后执行它以获得所需的结果集。

一个查询,适当构造。 C#构建它,然后使用数据库引擎实际执行它(注意:无论是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%
)

还有其他几种(更好/更清洁/专家)方法,但这通常是最基本的方面:您需要创建哪些查询字符串才能满足您的要求?作为奖励,这种方法(保持数据库工作在数据库领域)通常比创建数据子集,查询到另一个子集等快得多。一个查询(只要可能),有多个WHERE子句可以比创建和重复/递归查询临时数据集快几个数量级。

警告:袖手旁观的代码都不能按原样运作。仅用于说明目的。张贴在我出门的路上。