伙计们我有两个问题...首先我有一个查询姓名和姓氏的linq查询搜索并返回db的结果。例如。如果我搜索约翰,它将返回约翰特拉沃尔塔,这是完美的(我的问题是)如果我一起搜索约翰特拉沃尔塔的名字和姓氏,它将找不到结果?...帮助。
问题2:当我再次搜索时,如何清除搜索结果?因为当我第二次搜索上一次搜索的结果
时public class SearchResults
{
public string Name { get; set; }
public string Surname { get; set; }
public SearchResults(string name, string surname)
{
Name = name;
Surname = surname;
}
protected void btnSearch_Click(object sender, EventArgs e)
{
string search = txtSearch.Text.ToLower().TrimEnd();
lsSearchResults = null;
lsSearchResults = new List<SearchResults>();
Repeater1.DataSource = null;
lsSearchResults.Clear();
Repeater1.DataSource = "";
}
if (string.IsNullOrWhiteSpace(txtSearch.Text))
{
lblResults.Text = "Please enter a password & Em@ilAddress";
lsSearchResults.Clear();
return;
}
else
{
var found = (from User in myDB.Memberships
where User.Name.ToLower().Contains(txtSearch.Text.ToLower()) ||
User.Surname.ToLower().Contains(txtSearch.Text.ToLower())
select new { User.Name, User.Surname });
// validates items in search query if Exist
if (!ChillZARdev.App_Code.Utilities.IsEmpty(found))
{
foreach (var user in found)
{
lsSearchResults.Add(new SearchResults(user.Name, user.Surname));
// ls.Add(user.Name + " " + user.Surname);
// Response.Write(user);
}
Repeater1.DataSource = lsSearchResults;
Repeater1.DataBind();
}
}
答案 0 :(得分:4)
简短的解决方案是在where子句中包含firstname和surname:
var found = (from User in myDB.Memberships
where User.Name.ToLower().Contains(txtSearch.Text.ToLower()) ||
User.Surname.ToLower().Contains(txtSearch.Text.ToLower()) ||
(User.Name + " " + User.Surname).ToLower().Contains(txtSearch.Text.ToLower())
然而,这意味着搜索“特拉沃尔塔约翰”不会返回任何结果。
如果这很重要,你应该用空格分割字符串,并搜索每个单词。
List<string> searchSplit = txtSearch.Text.ToLower().Split(' ');
var found = (from User in myDB.Memberships
where IsMatch(searchSplit, User)
private bool IsMatch(List<string> searchSplit, User User){
return searchSplit.Count() ==
searchSplit.Where(x => User.Name.ToLower().Contains(x) ||
User.Surname.ToLower().Contains(x)).Count();
}
理想情况下,作为Steve B has commented,最好实施一个预先构建的搜索引擎,与简单的自定义搜索相比,这需要更多搜索工具。但这取决于您的预算/要求。
答案 1 :(得分:1)
几个月前,我遇到了同样的问题,我使用的是单例设计模式,根问题在于缓存..对于你的两个问题都有一个解决方案 - 你可以尝试清理缓存一个LINQ to SQL DataContext,您可以通过以下方式实现:
public static void ClearCache(this DataContext context)
{
const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
var method = context.GetType().GetMethod("ClearCache", FLAGS);
method.Invoke(context, null);
}
你可以调用那个方法
public void DoWork()
{
//do work...
dataContext.ClearCache();
//do more work...
}
希望有所帮助
答案 2 :(得分:1)
var found = myDB.Memberships;
foreach(var word in txtSearch.Text)
{
var word2=word; //Must do this because word won't be right at execution
found=found.Where(u=>u.Name.Contains(word2) || u.Surname.Contains(word2));
}
我删除了.ToLower,因为这些列应该已经标记为不区分大小写,除非您直接更改了它,或者是数据库的默认文化。