我的屏幕上有一个文本字段,用户可以从一个输入字段中搜索一些内容:
编写查询这些列的查询的最佳方法是什么?
如果我在空间上分割字符串,我该如何接受输入?还是逗号?
用户输入= 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进行索引。
答案 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;