दिलचस्प पोस्ट
घोषणा / उद्देश्य चर में स्थानों की परिभाषा? 2-मार्गी विलय के मुकाबले एक 3-रास्ता विलय क्यों फायदेमंद है? एक्शनबार ऊंचाई कैसे प्राप्त करें? मैं JavaFX में प्रगति बार घटक कैसे शैली कर सकता हूं LinqPad – SQL कन्वर्ट करने के लिए Linq आदेश एंड्रॉइड ऐरे कस्टम ऑब्जेक्ट की सूची – साझा करने के लिए सहेजें – संदर्भ – सीरियलाइजबल? JQuery के साथ तत्व प्रकार प्राप्त करें पीडीएफ बनाने के दौरान चेक अक्षरों को नहीं मिल सकता है स्मृति में वस्तु का आकार कैसे प्राप्त करें? सीएसएस का उपयोग कर गोल कोनों बनाना base64 एन्कोडेड छवि आकार पांडों में सेटिंगविथकॉपी चेतावनी से निपटने के लिए कैसे? ऊंचाई निर्धारित करना: मेरे लेबल तत्व पर 100% काम नहीं करता एक अंगुलर जेएस सेवा में एक नकली इंजेक्शन सी ++ में एल उपसर्ग बिल्कुल क्या है?

Linq में Row_number over (xxx द्वारा विभाजन)?

मेरे पास एक डेटाटाले है जिसकी संरचना और डेटा है:

 आईडी |  inst |  नाम
 ------------------------
  1 |  गिटार |  जॉन
  2 |  गिटार |  जॉर्ज
  3 |  गिटार |  पॉल
  4 |  ड्रम |  रिंगो
  5 |  ड्रम |  पीट

मैं इस तरह के अभिलेख पुनः प्राप्त कर सकता हूं:

IEnumerable <Beatle>... class Beatle { int id; string inst; string name; } 

मैं उन लोगों के आंतरिक आदेश प्राप्त करना चाहता हूं जो अलग-अलग उपकरण खेलते हैं MSSQL में मैं उपयोग करना चाहता हूँ

 SELECT * ,Row_Number() OVER (PARTITION BY inst ORDER BY id) AS rn FROM Beatles 

यह क्वेरी रिटर्न

 आईडी |  inst |  नाम |  आर.एन.
 -----------------------------
  1 |  गिटार |  जॉन |  1
  2 |  गिटार |  जॉर्ज |  2
  3 |  गिटार |  पॉल |  3
  4 |  ड्रम |  रिंगो | |  1
  5 |  ड्रम |  पेटी |  2

मैं यह कैसे कर सकता हूँ Linq में ?

संपादित करें। (स्वीकृत उत्तर के बाद)

पूर्ण कार्य कोड:

 var beatles = (new[] { new { id=1 , inst = "guitar" , name="john" }, new { id=2 , inst = "guitar" , name="george" }, new { id=3 , inst = "guitar" , name="paul" }, new { id=4 , inst = "drums" , name="ringo" }, new { id=5 , inst = "drums" , name="pete" } }); var o = beatles.OrderBy(x => x.id).GroupBy(x => x.inst) .Select(g => new { g, count = g.Count() }) .SelectMany(t => tgSelect(b => b).Zip(Enumerable.Range(1, t.count), (j, i) => new { j.inst, j.name, rn = i })); foreach (var i in o) { Console.WriteLine("{0} {1} {2}", i.inst, i.name, i.rn); } 

वेब के समाधान से एकत्रित समाधान "Linq में Row_number over (xxx द्वारा विभाजन)?"

बी 'एच

मुझे पता है यह पुराना है लेकिन समाधान क्यों नहीं है?

 var o = beatles.GroupBy(x => x.inst) .SelectMany(g => g.Select((j, i) => new { j.inst, j.name, rn = i + 1 }) ); 

यह एक लाइनर आज़माएं:

 var o = beatles .OrderBy( x => x.id ) .GroupBy( x => x.inst ) .Select( group => new { Group = group, Count = group.Count() } ) .SelectMany( groupWithCount => groupWithCount.Group.Select( b => b) .Zip( Enumerable.Range( 1, groupWithCount.Count ), ( j, i ) => new { j.inst, j.name, RowNumber = i } ) ); foreach (var i in o) { Console.WriteLine( "{0} {1} {2}", i.inst, i.name, i.RowNumber ); } 

आउटपुट:

 Guitar John 1 Guitar George 2 Guitar Paul 3 drums Ringo 1 drums Pete 2 

एक और विचार एक दृश्य का उपयोग कर रहा है, यदि संभव हो

जैसा @The_Smallest बताता है, पंक्ति संख्या LINQ द्वारा समर्थित नहीं है। यहां बताया गया है कि आप जो भी ढूंढ रहे हैं उसे प्राप्त कर सकते हैं:

 var grouped = beatles.OrderBy( x => x.id ) .ToList() // required because SelectMany below doesn't evaluate to SQL .GroupBy( x => x.inst ); var rns = grouped.ToDictionary( x => x.Key, x => 1 ); var result = grouped .SelectMany( x => x.Select( y => new { inst = y.inst, name = y.name, rn = rns[y.inst]++ } ) ); 

उचित सूचकांक पाने के लिए कुछ को आपके कोड में उपयोगी हो सकता है

। चुनें (आइटम, आई) => नया {आइटम = आइटम, सूचकांक = i})

रैंक () के बराबर करने के लिए एक अन्य समाधान ("विभाजन द्वारा" आदेश द्वारा "आदेश बाय" डीईएससी द्वारा विभाजन):

  DataTable Rank(DataTable dt, string partitionBy, string orderBy, int whichRank) { DataView dv = new DataView(dt); dv.Sort = partitionBy + ", " + orderBy + " DESC"; DataTable rankDt = dv.ToTable(); rankDt.Columns.Add("Rank"); int rank = 1; for (int i = 0; i < rankDt.Rows.Count - 1; i++) { rankDt.Rows[i]["Rank"] = rank; DataRow thisRow = rankDt.Rows[i]; DataRow nextRow = rankDt.Rows[i + 1]; if (thisRow[partitionBy].ToString() != nextRow[partitionBy].ToString()) rank = 1; else rank++; } DataView selectRankdv = new DataView(rankDt); selectRankdv.RowFilter = "rank = " + whichRank; return selectRankdv.ToTable(); } 

वस्तुओं के लिए Linq के लिए एक अन्य समाधान है:

 var result = beatles .GroupBy(g => g.inst) // PARTITION BY ^^^^ .Select(c => c.OrderBy(o => o.id).Select((v, i) => new { i, v }).ToList()) // ORDER BY ^^ .SelectMany(c => c) .Select(c => new { cvid, cvinst, cvname, rn = ci + 1 }) .ToList(); 

[ C# Demo ]

Context.ExecuteQuery<T>(string sQuery, object[] oParam)

यह अधिक सरल और तेज समय का सबसे अधिक है