Linq搜索没有返回所有条目

时间:2013-07-08 12:24:11

标签: c# asp.net linq

伙计们我有两个问题...首先我有一个查询姓名和姓氏的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();

             }
          }

3 个答案:

答案 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,因为这些列应该已经标记为不区分大小写,除非您直接更改了它,或者是数据库的默认文化。