Linq to sql查询多列-查询帮助
本文关键字:查询 帮助 sql Linq to | 更新日期: 2023-09-27 18:07:58
我的屏幕上有一个文本框,用户可以从一个输入框中搜索一些东西:
- <
- 地址/gh>
- 邮编 <
- 客户名称/gh>
- 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的索引
也许有一个想法:在数据库中创建一个额外的列,其中包含您想要搜索的所有列,作为一个大的集中字符串。然后对您的输入字符串与数据库中的该字段进行免费文本搜索。
由于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;