none
請問linQ 要怎麼寫才能查出資料中 count數多於一筆的資料呢 RRS feed

  • 問題

  • dbData中資料{ab,abd,asg,se}

    pageData中資料{abc,abe,abdw,sef,abc,asgs,abc,abe,sef,seg}

     

     

    ArrayList dbData = new ArrayList(); 

    ArrayList pageData = new ArrayList(); 

     

     for (int i = 0; i < dbData.Count; i++) 

                { 

                    var errno = from nineNo in pageData.Cast<string>() 

                                where nineNo == dbData[i].ToString() 

                                select nineNo; 

                    foreach (string[] nineNo in errno) 

                    { 

                        Console.WriteLine(nineNo); 

                    } 

                } 

     

    希望能夠查詢出的資料是abc,abe,sef

    就是如果只有1筆又與dbData中資料相同而且筆數又大於1不知道這樣where那邊除了相同之外
    count的參數要如何下呢...
    google了許久也想不出來要怎麼寫
    懇請各位前輩指點 感謝

     


    2011年7月21日 上午 06:47

解答

  • string[] dbData = { "ab""abd""asg""se" };
    string[] pageData = { "abc""abe""abdw""sef", 
                            "abc""asgs""abc""abe",
                            "sef""seg" };
     
    string[] result = 
        (from p in pageData
        where dbData.Contains(p, new LikeCompare())
        select new {
            Data = p,
            Count = pageData.Count(p1 => p1.Equals(p))
        })
        .Where(p => p.Count > 1)
        .Select(p => p.Data)
        .Distinct()
        .ToArray();

     

    class LikeCompare : IEqualityComparer<string> {
     
        bool IEqualityComparer<string>.Equals(string x, string y) {
            return y.Substring(0, x.Length).Equals(x);
        }
     
        int IEqualityComparer<string>.GetHashCode(string obj) {
            return obj.GetHashCode();
        }
    }
    • 已提議為解答 TerryChuang 2011年7月21日 上午 08:44
    • 已標示為解答 zeanmar 2011年7月21日 上午 09:42
    2011年7月21日 上午 07:53

所有回覆

  • 試試看先將資料做GroupBy之後,就可以取出同一群的筆數,程式碼如下:

    using (NorthwindEntities context = new NorthwindEntities())
    {
    	var query = from p in context.Order_Details
    				group p by p.OrderID into q
    				select new { cnt = q.Count(), q.Key };
    	foreach (var item in query.Where(o=>o.cnt >1))
    	{
    		Console.WriteLine(string.Format("{0},{1}", item.Key, item.cnt));
    	}
    				
    }


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年7月21日 上午 07:06
  • 就是如果只有1筆又與dbData中資料相同而且筆數又大於1不知道這樣where那邊除了相同之外

    看不太懂這句話的意思

    2011年7月21日 上午 07:18
  • 感謝TerryChuang撥空回答

    因為小弟有的資料是arraylist不知道這樣的話可以怎麼做呢

    感謝

    2011年7月21日 上午 07:28
  • 就是如果只有1筆又與dbData中資料相同而且筆數又大於1不知道這樣where那邊除了相同之外

    看不太懂這句話的意思

    dbData中資料{ab,abd,asg,se}

    pageData中資料{abc,abe,abdw,sef,abc,asgs,abc,sef,seg}

    查詢結果為abc,sef

    abc,abe,這兩筆資料在pageData 中與dbData中的ab相似

    而abc在pageData中有三筆 而abe資料只有1筆

    只顯示abc

    如sef,seg此兩筆資料皆類似於dbData中的se

    但是seg在pageData中只有1筆而sef有2筆

    只篩選出sef

    如此解釋希望會比較清楚

    感謝

    2011年7月21日 上午 07:34
  • string[] dbData = { "ab""abd""asg""se" };
    string[] pageData = { "abc""abe""abdw""sef", 
                            "abc""asgs""abc""abe",
                            "sef""seg" };
     
    string[] result = 
        (from p in pageData
        where dbData.Contains(p, new LikeCompare())
        select new {
            Data = p,
            Count = pageData.Count(p1 => p1.Equals(p))
        })
        .Where(p => p.Count > 1)
        .Select(p => p.Data)
        .Distinct()
        .ToArray();

     

    class LikeCompare : IEqualityComparer<string> {
     
        bool IEqualityComparer<string>.Equals(string x, string y) {
            return y.Substring(0, x.Length).Equals(x);
        }
     
        int IEqualityComparer<string>.GetHashCode(string obj) {
            return obj.GetHashCode();
        }
    }
    • 已提議為解答 TerryChuang 2011年7月21日 上午 08:44
    • 已標示為解答 zeanmar 2011年7月21日 上午 09:42
    2011年7月21日 上午 07:53
  • 關於linq的like 可以參考 demo 大的這一篇http://demo.tc/Post/512

    Contains、StartsWith、EndsWith來替代LIKE的功能

     


    coding or not
    2011年7月21日 上午 08:01
  • 說得是。StartsWith簡潔多了

    我用SubString真的遜掉了

    2011年7月21日 上午 08:15
  • 感謝TerryChuang撥空回答

    因為小弟有的資料是arraylist不知道這樣的話可以怎麼做呢

    感謝


    不好意思,我以為你用arraylist是示意,所以才用EF來測試你的問題。
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年7月21日 上午 08:36
  • 阿尼大給的是觀念~才沒有遜掉咧 ,給你一個攢 :)
    coding or not
    2011年7月21日 上午 08:38
  • string[] dbData = { "ab""abd""asg""se" };
    string[] pageData = { "abc""abe""abdw""sef", 
                            "abc""asgs""abc""abe",
                            "sef""seg" };
     
    string[] result = 
        (from p in pageData
        where dbData.Contains(p, new LikeCompare())
        select new {
            Data = p,
            Count = pageData.Count(p1 => p1.Equals(p))
        })
        .Where(p => p.Count > 1)
        .Select(p => p.Data)
        .Distinct()
        .ToArray();

     

    class LikeCompare : IEqualityComparer<string> {
     
        bool IEqualityComparer<string>.Equals(string x, string y) {
            return y.Substring(0, x.Length).Equals(x);
        }
     
        int IEqualityComparer<string>.GetHashCode(string obj) {
            return obj.GetHashCode();
        }
    }

    沒想到LINQ可以這樣用,又學到一招了。
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已標示為解答 zeanmar 2011年7月21日 上午 09:10
    • 已取消標示為解答 zeanmar 2011年7月21日 上午 09:42
    2011年7月21日 上午 08:45
  • 感謝各位前輩的指點

    我終於try出來了

    是應該多多加強自己的知識了...

    感謝各位

    2011年7月21日 上午 09:11
  • 你標的解答怪怪的...
    coding or not
    2011年7月21日 上午 09:39
  • 真是尷尬~的確,如果這樣也算是解答,那我還真是賺到了。
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年7月21日 上午 09:41