none
linq搜尋問題 RRS feed

  • 問題

  • 各位高手幫忙看一下,我先用 List<string>把要搜尋的資料存進去
    之後再利用迴圈的方式把所有的搜尋條件跑完
    但是現在發生一個很嚴重的問題,當第一次迴圈跑完時,是有搜尋到符合條件的資料
    但是第2圈開始跑時q卻會回復成還沒加入搜尋條件的結果
    造成最後的結果只有搜尋到最後一次的條件,不知道是不是程式哪裡出錯了呢?
    請大大們幫忙看一下,程式碼如下:

    List<stringsitem = new List<string>();
    List<string> svaluenew List<string>();
    int nowRows=0;
    sitem.Add("title");
    svalue.Add("新聞");
    sitem.Add("org");
    svalue.Add("企劃部");

    IQueryable<news> q = _db.news;
     
    if (sitem.Count > 0)
    {
     
        for (int i = 0; i < sitem.Count; i++)
        {
            nowRows = q.Count();//第2次迴圈開始跑時,又變回尚未搜尋前的筆數
            if (svalue[i].ToString()!="")         {             if (sitem[i].ToString() == "title")             {                 q = q.Where(n => n.title.Contains(svalue[i].ToString()));             }             else if (sitem[i].ToString() == "org")             {                 q = q.Where(n => n.org.Contains(svalue[i].ToString()));             }         }         nowRows = q.Count(); //第1次迴圈跑完時,因為經過搜尋條件,這裡的筆數是223     } }

    http://www.gglisten.com/
    • 已編輯 子涵 2011年10月14日 下午 03:50
    • 已移動 阿尼 2011年10月16日 下午 04:34 (從:ASP.NET 與 AJAX(ASP.NET and AJAX))
    2011年10月14日 下午 03:49

解答

  • 改用List<News>來存放,不要用原本的IEnumerableIQueryable

    Sample Code:

        class Program
        {
            static void Main(string[] args)
            {
                List<string> items = new List<string>() { "test", "title", "org", "content" };
                List<string> values = new List<string>();
                List<News> q = GetDataSource().ToList<News>();
    
                int count = 0;
                foreach (var item in items)
                {
                    Console.WriteLine("準備要檢查的項目:{1}, 現在總計的count: {0}", count.ToString(), item);
                    if (item == "title")
                    {
                        var filterResult = q.Where(n => n.Title.Contains(item));
                        int result = filterResult.Count();
                        Console.WriteLine("符合{0}項目共有{1}個", item, result.ToString());
                        count = result;
                        q = filterResult.ToList<News>();
                    }
                    else if (item == "org")
                    {
                        var filterResult = q.Where(n => n.Org.Contains(item));
                        int result = filterResult.Count();
                        Console.WriteLine("符合{0}項目共有{1}個", item, result.ToString());
                        count = result;
                        q = filterResult.ToList<News>();
                    }
    
                }
    
                Console.WriteLine("最後總共數目:{0}", count.ToString());
                foreach (var item in q)
                {
                    Console.WriteLine("title:{0}, Org:{1}", item.Title, item.Org);
                }
            }
    
            private static IEnumerable<News> GetDataSource()
            {
                var result = new List<News> 
                { 
                    new News{ Org="org1", Title="title1"},
                    new News{ Org="??", Title="??"},
                    new News{ Org="org3", Title="title3"},
                    new News{ Org="abc", Title="title4"},
                    new News{ Org="123", Title="title2"}
                };
    
                return result;
            }
        }
    


    執行結果:

    希望這樣是你要的


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    • 已標示為解答 子涵 2011年10月21日 上午 07:51
    2011年10月16日 上午 03:46

所有回覆

  • 請問i=1的時候,nowRows的值為何?

    for (int i = 0; i < sitem.Count; i++)
    {
    	nowRows = q.Count();//第2次迴圈開始跑時,q.Count = ????
    
    	if (svalue[i].ToString()!="")
    	{
    		if (sitem[i].ToString() == "title")
    		{
    			q = q.Where(n => n.title.Contains(svalue[i].ToString()));
    		}
    		else if (sitem[i].ToString() == "org")
    		{
    			q = q.Where(n => n.org.Contains(svalue[i].ToString()));
    
    		}
    	}
    	nowRows = q.Count(); //第1次迴圈跑完時,因為經過搜尋條件,這裡的筆數是223
    }



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年10月15日 上午 02:20
  • 寫了個sample給你參考一下,因為您給的資訊不太足夠,不太確定你想要做的是什麼。

     class Program
        {
            static void Main(string[] args)
            {
                List<string> items = new List<string>() { "title", "org", "content" };
                List<string> values = new List<string>();
                IEnumerable<News> q = GetDataSource();
    
                int count = 0;
                foreach (var item in items)
                {
                    Console.WriteLine("準備要檢查的項目:{1}, 現在總計的count: {0}", count.ToString(), item);
                    if (item == "title")
                    {
                        var filterResult = q.Where(n => n.Title.Contains(item));
                        int result = filterResult.Count();
                        Console.WriteLine("符合{0}項目共有{1}個", item, result.ToString());
                        count += result;
                    }
                    else if (item == "org")
                    {
                        var filterResult = q.Where(n => n.Org.Contains(item));
                        int result = filterResult.Count();
                        Console.WriteLine("符合{0}項目共有{1}個", item, result.ToString());
                        count += result;
                    }
                }
    
                Console.WriteLine("最後總共數目:{0}", count.ToString());
            }
    
            private static IEnumerable<News> GetDataSource()
            {
                var result = new List<News> 
                { 
                    new News{ Org="org1", Title="title1"},
                    new News{ Org="??", Title="??"},
                    new News{ Org="123", Title="title2"}
                };
    
                return result;
            }
        }
    


    附上執行結果:

     


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年10月15日 上午 02:52
  • 謝謝你很詳細的回答

    不好意思沒有說清楚,主要是要用and來搜尋資料

    假如第1次搜尋的筆數是223,那第2次就要從223裡面再去找符合條件的資料,所以筆數會一樣或者是更少

    目前的問題就是第2次迴圈q在第1次的搜尋條件不見了,變成又從最原始的資料開始搜尋


    http://www.gglisten.com/
    2011年10月15日 下午 04:40
  • i=0時

    第1個nowRows是25546

    第2個nowRows是223

     

    i=1時

    第1個nowRows是25546 (但是這裡應該是223,因為要從223裡再去搜尋符合第2個搜尋條件的資料)

    第2個nowRows是138


    http://www.gglisten.com/
    2011年10月15日 下午 04:43
  • 改用List<News>來存放,不要用原本的IEnumerableIQueryable

    Sample Code:

        class Program
        {
            static void Main(string[] args)
            {
                List<string> items = new List<string>() { "test", "title", "org", "content" };
                List<string> values = new List<string>();
                List<News> q = GetDataSource().ToList<News>();
    
                int count = 0;
                foreach (var item in items)
                {
                    Console.WriteLine("準備要檢查的項目:{1}, 現在總計的count: {0}", count.ToString(), item);
                    if (item == "title")
                    {
                        var filterResult = q.Where(n => n.Title.Contains(item));
                        int result = filterResult.Count();
                        Console.WriteLine("符合{0}項目共有{1}個", item, result.ToString());
                        count = result;
                        q = filterResult.ToList<News>();
                    }
                    else if (item == "org")
                    {
                        var filterResult = q.Where(n => n.Org.Contains(item));
                        int result = filterResult.Count();
                        Console.WriteLine("符合{0}項目共有{1}個", item, result.ToString());
                        count = result;
                        q = filterResult.ToList<News>();
                    }
    
                }
    
                Console.WriteLine("最後總共數目:{0}", count.ToString());
                foreach (var item in q)
                {
                    Console.WriteLine("title:{0}, Org:{1}", item.Title, item.Org);
                }
            }
    
            private static IEnumerable<News> GetDataSource()
            {
                var result = new List<News> 
                { 
                    new News{ Org="org1", Title="title1"},
                    new News{ Org="??", Title="??"},
                    new News{ Org="org3", Title="title3"},
                    new News{ Org="abc", Title="title4"},
                    new News{ Org="123", Title="title2"}
                };
    
                return result;
            }
        }
    


    執行結果:

    希望這樣是你要的


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    • 已標示為解答 子涵 2011年10月21日 上午 07:51
    2011年10月16日 上午 03:46
  • 改用List<News>來存放,不要用原本的IEnumerableIQueryable

    Sample Code:

     

        class Program
        {
            static void Main(string[] args)
            {
                List<string> items = new List<string>() { "test", "title", "org", "content" };
                List<string> values = new List<string>();
                List<News> q = GetDataSource().ToList<News>();
    
                int count = 0;
                foreach (var item in items)
                {
                    Console.WriteLine("準備要檢查的項目:{1}, 現在總計的count: {0}", count.ToString(), item);
                    if (item == "title")
                    {
                        var filterResult = q.Where(n => n.Title.Contains(item));
                        int result = filterResult.Count();
                        Console.WriteLine("符合{0}項目共有{1}個", item, result.ToString());
                        count = result;
                        q = filterResult.ToList<News>();
                    }
                    else if (item == "org")
                    {
                        var filterResult = q.Where(n => n.Org.Contains(item));
                        int result = filterResult.Count();
                        Console.WriteLine("符合{0}項目共有{1}個", item, result.ToString());
                        count = result;
                        q = filterResult.ToList<News>();
                    }
    
                }
    
                Console.WriteLine("最後總共數目:{0}", count.ToString());
                foreach (var item in q)
                {
                    Console.WriteLine("title:{0}, Org:{1}", item.Title, item.Org);
                }
            }
    
            private static IEnumerable<News> GetDataSource()
            {
                var result = new List<News> 
                { 
                    new News{ Org="org1", Title="title1"},
                    new News{ Org="??", Title="??"},
                    new News{ Org="org3", Title="title3"},
                    new News{ Org="abc", Title="title4"},
                    new News{ Org="123", Title="title2"}
                };
    
                return result;
            }
        }
    

     


    執行結果:

    希望這樣是你要的


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    原來如此,非常謝謝你詳細的解答...^^
    http://www.gglisten.com/
    2011年10月21日 上午 07:52