একাধিক কলাম দ্বারা গ্রুপ


967

আমি কীভাবে লিনকিউতে গ্রুপপাইয়ের একাধিক কলাম করতে পারি

এসকিউএল এর সাথে এর অনুরূপ কিছু:

SELECT * FROM <TableName> GROUP BY <Column1>,<Column2>

আমি কীভাবে এটিকে লিনকিউতে রূপান্তর করতে পারি:

QuantityBreakdown
(
    MaterialID int,
    ProductID int,
    Quantity float
)

INSERT INTO @QuantityBreakdown (MaterialID, ProductID, Quantity)
SELECT MaterialID, ProductID, SUM(Quantity)
FROM @Transactions
GROUP BY MaterialID, ProductID

উত্তর:


1212

একটি বেনামি প্রকার ব্যবহার করুন।

যেমন

group x by new { x.Column1, x.Column2 }

29
আপনি যদি বেনামে টাইপের সাথে গোষ্ঠী তৈরিতে নতুন হন তবে এই উদাহরণে 'নতুন' কীওয়ার্ডটির ব্যবহার যাদু করে।
ক্রিস

8
এনওয়াইবার্নেটের সাথে এমভিসি ক্ষেত্রে ডিএল ইস্যুতে ত্রুটি পাচ্ছে। গ্রুপবি দ্বারা সমস্যা সমাধান করা হয়েছে (x => নতুন {এক্স.কলাম 1, এক্স। কলাম 2}, (কী, গোষ্ঠী) => নতুন 1 কী 1 = কী। কলাম 1, কী 2 = কী.কলাম 2, ফলাফল = গোষ্ঠী T টোলিস্ট ()});
মিলান

আমি ভেবেছিলাম এই ক্ষেত্রে নতুন অবজেক্টগুলি রেফারেন্সের সাথে তুলনা করে, সুতরাং কোনও মিল নেই - কোনও গ্রুপিং নেই।
হোগো

4
@ হোগো বেনামে টাইপ করা অবজেক্টগুলি তাদের নিজস্ব সমান এবং গেটহ্যাশকোড পদ্ধতি প্রয়োগ করে যা বস্তুগুলিকে গোষ্ঠীকরণ করার সময় ব্যবহৃত হয়।
বায়রন কারাস্কো

আপনি যখন লিন্কে নতুন হন তখন আউটপুট ডেটা কাঠামোটি কল্পনা করা কিছুটা শক্ত। এটি কী এমন কোনও গোষ্ঠী তৈরি করে যেখানে বেনামে টাইপটি কী হিসাবে ব্যবহৃত হয়?
জ্যাকস

760

পদ্ধতিগত নমুনা

.GroupBy(x => new { x.Column1, x.Column2 })

কী ধরণের জিনিসটি ফেরত দেওয়া হয়?
এমজিজি সোফট

5
@ এমজিজি_সোফট যা একটি অনামী প্রকার হবে
অ্যালেক্স

এই কোডটি আমার পক্ষে কাজ করছে না: "অবৈধ নামবিহীন ধরণের ঘোষক।"
thalesfc

19
@ টমকে এটির মতো কাজ করা উচিত। আপনি যখন কোনও বেনামে টাইপ সি # এর ক্ষেত্রের নাম এড়িয়ে যান তখন ধরে নেওয়া হয় আপনি শেষ পর্যন্ত অ্যাক্সেস করা সম্পত্তি / ক্ষেত্রের নামটি প্রক্ষেপণ থেকে ব্যবহার করতে চান want (সুতরাং আপনার উদাহরণটি Mo0gles এর সমতুল্য)
ক্রিস

1
আমার উত্তর খুঁজে পেয়েছি। আমি কলাম 1 এবং কলাম 2 বৈশিষ্ট্যযুক্ত একটি নতুন সত্তা (মাইভিউ এন্টিটি) সংজ্ঞায়িত করতে হবে এবং ফেরতের প্রকারটি হ'ল: অগণিত <আইগ্রুপিং <মাইভিউইন্টিটি, মাইটিটিটি >> এবং গ্রুপিং কোড স্নিপটি হল: মাইএনটিটিলিস্ট.গ্রুপবি (MyEntity => নতুন MyViewEntity> কলাম 1) my কলাম 1, কলাম 2 = মাইটিটিটি umn কলাম 2});
আমির চত্বরবাহর

467

ঠিক আছে এটি পেয়েছেন:

var query = (from t in Transactions
             group t by new {t.MaterialID, t.ProductID}
             into grp
                    select new
                    {
                        grp.Key.MaterialID,
                        grp.Key.ProductID,
                        Quantity = grp.Sum(t => t.Quantity)
                    }).ToList();

75
+1 - বিস্তৃত উদাহরণের জন্য ধন্যবাদ। অন্য উত্তরের স্নিপেটগুলি খুব ছোট এবং প্রসঙ্গ ছাড়াই without এছাড়াও আপনি একটি মোট ফাংশন দেখান (এই ক্ষেত্রে যোগফল)। খুব উপকারী. আমি একটি সামগ্রিক ক্রিয়াকলাপ (যেমন, ম্যাক্স, এমআইএন, এসইএম, ইত্যাদি) এর পাশাপাশি একসাথে একটি সাধারণ দৃশ্য হিসাবে গ্রুপিংয়ের ব্যবহার দেখতে পাচ্ছি।
ব্যারিপিকার 18

এখানে: stackoverflow.com/questions/14189537/… , যখন একটি একক কলামের উপর ভিত্তি করে গ্রুপিং করা হয়, যার নাম জানা যায়, তখন এটি একটি ডাটা টেবিলের জন্য দেখানো হয়, তবে যে কলামগুলির ভিত্তিতে গোষ্ঠীকরণ করা হবে তার ভিত্তিতে কীভাবে এটি করা যায়? গতিশীলভাবে উত্পন্ন করতে হবে?
বিজি

এটি গ্রুপিংয়ের ধারণাটি বোঝার জন্য এবং এর উপরে একত্রিতকরণ প্রয়োগ করতে সত্যই সহায়ক।
rajbdotnet

1
দুর্দান্ত উদাহরণ ... ঠিক আমি যা খুঁজছিলাম। আমার এমনকি সামগ্রিক প্রয়োজন ছিল তাই এটি সঠিক উত্তর ছিল যদিও আমি ল্যাম্বদা খুঁজছিলাম আমার প্রয়োজনগুলি সমাধান করার জন্য এটি থেকে যথেষ্ট পরিমাণে পেয়েছি।
কেভবো

153

একাধিক কলাম অনুসারে গ্রুপের জন্য, পরিবর্তে এটি চেষ্টা করুন ...

GroupBy(x=> new { x.Column1, x.Column2 }, (key, group) => new 
{ 
  Key1 = key.Column1,
  Key2 = key.Column2,
  Result = group.ToList() 
});

একইভাবে আপনি কলাম 3, কলাম 4 ইত্যাদি যুক্ত করতে পারেন


4
এটি খুব সহায়ক ছিল এবং আরও অনেকগুলি উত্সাহ পাওয়া উচিত! Resultসমস্ত কলামে লিঙ্কযুক্ত সমস্ত ডেটা সেট রয়েছে। অনেক ধন্যবাদ!
j00hi

1
দ্রষ্টব্য: আমাকে ব্যবহার করতে হয়েছিল। ToList () এর পরিবর্তে অগণিত ()
GMan

1
দুর্দান্ত, এর জন্য ধন্যবাদ এখানে আমার উদাহরণ। নোট করুন যে গেটফিজ একটি আইকোয়ারিযোগ্য <ফাই> রেজিস্ট্রিঅ্যাকউন্টএডিএ.গেটফিস (রেজিস্ট্রি অ্যাকাউন্টসেট, থেকে তারিখ, টু ডেট) প্রদান করেছে , ফি-নাম = কী.ফিইনাম, অ্যাপ্লাইডফাই = গ্রুপ .সুম (x => x. অ্যাপ্লাডফাই) ?? 0 এম}) To টোললিস্ট ();
ক্রেগ বি

এই কোয়েরি থেকে অন্যান্য কলামগুলি পাওয়া যায় না, যা গোষ্ঠীভুক্ত ছিল না? যদি অবজেক্টের অ্যারে থাকে তবে আমি এই বিষয়টিকে দুটি কলাম দ্বারা বিভক্ত করতে চাই, তবে কেবলমাত্র দুটি কলামই নয়, বস্তুটি থেকে সমস্ত সম্পত্তি পেতে পারি।
ফ্রেনকিবি

30

সি # 7 যেহেতু আপনি মান টিপলগুলিও ব্যবহার করতে পারেন:

group x by (x.Column1, x.Column2)

অথবা

.GroupBy(x => (x.Column1, x.Column2))

2
ঠিক আছে আমি মনে করি আপনি একটি অতিরিক্ত মিস করছেন) শেষে। আপনি ()
স্টুইটারস্লার্ফ

আমি এটি যোগ করেছি।
নাথান ট্রেগিলাস

2
.গ্রুপবি (x => নতুন {এক্স.কলাম 1, এক্স। কলাম 2})
জাহিদুল ইসলাম জ্যামি

19

সি # 7.1 বা তার চেয়ে বড় ব্যবহার Tuplesএবং Inferred tuple element names(বর্তমানে এটি সঙ্গে কেবলমাত্র তখনই কাজ linq to objectsএবং এটি সমর্থিত না হলে মত প্রকাশের গাছ যেমন প্রয়োজন হয় someIQueryable.GroupBy(...)গিটহাব ইস্যু ):

// declarative query syntax
var result = 
    from x in inMemoryTable
    group x by (x.Column1, x.Column2) into g
    select (g.Key.Column1, g.Key.Column2, QuantitySum: g.Sum(x => x.Quantity));

// or method syntax
var result2 = inMemoryTable.GroupBy(x => (x.Column1, x.Column2))
    .Select(g => (g.Key.Column1, g.Key.Column2, QuantitySum: g.Sum(x => x.Quantity)));

সি # 3 বা ততোধিক ব্যবহার করে anonymous types:

// declarative query syntax
var result3 = 
    from x in table
    group x by new { x.Column1, x.Column2 } into g
    select new { g.Key.Column1, g.Key.Column2, QuantitySum = g.Sum(x => x.Quantity) };

// or method syntax
var result4 = table.GroupBy(x => new { x.Column1, x.Column2 })
    .Select(g => 
      new { g.Key.Column1, g.Key.Column2 , QuantitySum= g.Sum(x => x.Quantity) });

18

আপনি দৃ strongly়ভাবে টাইপ করা গ্রুপিংয়ের জন্য একটি টুপল <>ও ব্যবহার করতে পারেন।

from grouping in list.GroupBy(x => new Tuple<string,string,string>(x.Person.LastName,x.Person.FirstName,x.Person.MiddleName))
select new SummaryItem
{
    LastName = grouping.Key.Item1,
    FirstName = grouping.Key.Item2,
    MiddleName = grouping.Key.Item3,
    DayCount = grouping.Count(), 
    AmountBilled = grouping.Sum(x => x.Rate),
}

4
দ্রষ্টব্য: লিনক টু সত্তাগুলিতে একটি নতুন টুপল তৈরি করা সমর্থিত নয়
বোকা মরমন

8

যদিও এই প্রশ্নটি শ্রেণিবদ্ধ সম্পত্তি দ্বারা গোষ্ঠী সম্পর্কে জিজ্ঞাসা করছে, আপনি যদি কোনও ADO অবজেক্টের (যেমন একটি ডেটা টেবিলের) বিপরীতে একাধিক কলাম দ্বারা দলবদ্ধ করতে চান তবে আপনাকে আপনার "নতুন" আইটেমগুলি ভেরিয়েবলগুলিতে নির্ধারণ করতে হবে:

EnumerableRowCollection<DataRow> ClientProfiles = CurrentProfiles.AsEnumerable()
                        .Where(x => CheckProfileTypes.Contains(x.Field<object>(ProfileTypeField).ToString()));
// do other stuff, then check for dups...
                    var Dups = ClientProfiles.AsParallel()
                        .GroupBy(x => new { InterfaceID = x.Field<object>(InterfaceField).ToString(), ProfileType = x.Field<object>(ProfileTypeField).ToString() })
                        .Where(z => z.Count() > 1)
                        .Select(z => z);

1
আমি লিনক ক্যোয়ারী "গ্রুপ সি" দ্বারা নতুন {সি। ফিল্ড <স্ট্রিং> ("শিরোনাম"), সি। ফিল্ড <স্ট্রিং> ("সিআইএফ")} "করতে পারিনি এবং আপনি আমাকে অনেক সময় বাঁচিয়েছেন !! চূড়ান্ত ক্যোয়ারীটি ছিল: "গ্রুপ সি দ্বারা নতুন {টাইটুলো = সি.ফিল্ড <স্ট্রিং> (" শিরোনাম "), সিআইফ = সি.ফিল্ড <স্ট্রিং> (" সিআইএফ ")}"
নেটডিক্টিকোস


4
.GroupBy(x => x.Column1 + " " + x.Column2)

সাথে মিলিত Linq.Enumerable.Aggregate()এই এমনকি বৈশিষ্ট্য একটি গতিশীল সংখ্যা দ্বারা গোষ্ঠীবদ্ধ করার জন্য অনুমতি দেয়: propertyValues.Aggregate((current, next) => current + " " + next)
কাই হার্টম্যান

3
যে কেউ কৃতিত্ব দিচ্ছে তার চেয়ে এটি আরও ভাল উত্তর। এটি সমস্যাযুক্ত হতে পারে যদি সংমিশ্রণের উদাহরণ থাকতে পারে যেখানে কলাম 1-এ কলাম 1 যুক্ত হয়েছে এমন পরিস্থিতিতে যেমন কলাম 1 পৃথক হবে ("আব" "সিডি" "অ্যাবিসি" "ডি" এর সাথে মিলবে) equal এটি বলেছিল, আপনি ডায়নামিক ধরণের ব্যবহার করতে না পারলে এটি দুর্দান্ত সমাধান কারণ আপনি পৃথক মত প্রকাশের মাধ্যমে গ্রুপের পরে ল্যাম্বডাস প্রাক-নির্মাণ করছেন।
ব্র্যান্ডন বার্কলে

3
"আব" "সিডিই" আসলে "অ্যাবসি" "ডি" এর সাথে মেলে না, সুতরাং এর মধ্যে ফাঁকা।
কাই হার্টম্যান

1
"অ্যাবসি দে" "" এবং "এবিসি" "দে" সম্পর্কে কী?
AlbertK

আমার ধারণা, অ্যালবার্ট যে কাজ করবে না।
কাই হার্টম্যান


2

নতুন এক্স new x.Col, x.Col by দ্বারা গ্রুপ এক্স


1

একটি বিষয় লক্ষণীয় যে আপনাকে ল্যাম্বদা এক্সপ্রেশনগুলির জন্য কোনও বস্তু প্রেরণ করতে হবে এবং কোনও শ্রেণীর জন্য উদাহরণ ব্যবহার করতে পারবেন না।

উদাহরণ:

public class Key
{
    public string Prop1 { get; set; }

    public string Prop2 { get; set; }
}

এটি সঙ্কলন করবে তবে প্রতি চক্রের জন্য একটি কী উত্পন্ন করবে ।

var groupedCycles = cycles.GroupBy(x => new Key
{ 
  Prop1 = x.Column1, 
  Prop2 = x.Column2 
})

আপনি যদি মূল বৈশিষ্ট্যগুলির নাম দিতে না চান এবং তারপরে তাদের পুনরুদ্ধার করতে পারেন তবে পরিবর্তে আপনি এটির মতো এটি করতে পারেন। এটি GroupByসঠিকভাবে এবং আপনাকে মূল বৈশিষ্ট্য দেবে।

var groupedCycles = cycles.GroupBy(x => new 
{ 
  Prop1 = x.Column1, 
  Prop2= x.Column2 
})

foreach (var groupedCycle in groupedCycles)
{
    var key = new Key();
    key.Prop1 = groupedCycle.Key.Prop1;
    key.Prop2 = groupedCycle.Key.Prop2;
}

0

কারণ ভিবি এবং বেনামী / ল্যামডা :

query.GroupBy(Function(x) New With {Key x.Field1, Key x.Field2, Key x.FieldN })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.