Linq to sql查询多列 - 查询帮助

时间:2011-09-09 08:50:08

标签: c# linq-to-sql

我的屏幕上有一个文本字段,用户可以从一个输入字段中搜索一些内容:

  1. 地址
  2. 邮编
  3. 客户名称
  4. ID
  5. 编写查询这些列的查询的最佳方法是什么?

    如果我在空间上分割字符串,我该如何接受输入?还是逗号?

    用户输入= 67 pottors lane 99
    其中“67 pottors lane”是地址
    “99”是/可能是ID

    到目前为止我所拥有的:

    //q = querystring
    //filteredlist = extension method for the table that I am querying
    //clientlist = list of clients I have passed in as a param
    

    //这是我对

    的查询
    if (!string.IsNullOrEmpty(q))
    {
      var result = q.Trim();
       filteredlist = filteredlist
       .Where(x => x.ID.Contains(q) || x.SubjectPropertyAddress1.Contains(q)
       || x.SubjectPropertyPostCode.Contains(q)
       || clientlist.Any(y=> x.ClientID == y.ClientID && (y.ID.Contains(q) || y.Name.Contains(q))  ));
    }
    

    注意:我将使用sql进行索引。

3 个答案:

答案 0 :(得分:1)

也许一个想法:在数据库中创建一个额外的列,其中包含您要搜索的所有列作为一个大的连续字符串。然后对输入字符串与数据库中的该字段进行自由文本搜索。

由于L2SQL不支持自由文本搜索,因此您需要在存储过程中执行此操作,或者在此处执行此操作(http://stackoverflow.com/questions/67706/linqtosql-and-full-text-search-可以-它待完成)

答案 1 :(得分:0)

哎呀 - 你有没有办法将输入分成ID,地址,邮政编码和姓名的单独字段?

如果是这样,你可以继续附加Where子句,比如

var query = filteredList;
if (!String.IsNullOrEmpty(id))
{
    query = query.Where(c => c.ID.Contains(id))
}
if (!String.IsNullOrEmpty(name))
{
    query = query.Where(c => c.Name.Contains(name))
}

..同名,地址等

否则,您的查询类似于搜索引擎查询而不是RDBMS查询。

答案 2 :(得分:0)

我过去做过非常类似的事情。我将搜索字符串拆分为空格字符并将其限制为最多6个搜索“单词”,以便linq仍然可以管理。

我提出了以下内容:

string[] words = q.ToLower().Split(' ');
string[] wordsFixed = new string[] {"", "", "", "", "", "" };

for(int i = 0; i < 6 && i < words.Length; i++)
    wordsFixed[i] = words[i];

    var data = from item in list
                    where (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[0]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[1]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[2]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[3]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[4]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[5])
                    select item;