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

本文关键字:查询 帮助 sql Linq to | 更新日期: 2023-09-27 18:07:58

我的屏幕上有一个文本框,用户可以从一个输入框中搜索一些东西:

    <
  1. 地址/gh>
  2. 邮编
  3. <
  4. 客户名称/gh>
  5. ID

写查询这些列的最好方法是什么?

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

用户输入= 67个端口通道99
其中"67波特巷"为地址
"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的索引

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

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

由于L2SQL不支持自由文本搜索,在这种情况下,您需要在存储过程中进行搜索,或者像这里(http://stackoverflow.com/questions/67706/linqtosql-and-full-text-search-can-it-be-done)

哎哟-您是否没有办法将输入拆分为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查询。

我以前也做过类似的事情。我在空格字符上分割搜索字符串,并将其限制为最多6个搜索"words",因此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;