سؤال

وعلى افتراض جدول العلامات مثل علامات السؤال ستاكوفيرفلوو:

<اقتباس فقرة>   

وTagID (BIGINT)، QuestionID (BIGINT)، علامة (VARCHAR)

ما هي الطريقة الأكثر فعالية للحصول على 25 علامات الأكثر استخداما استخدام LINQ؟ في SQL، فإن مجموعة بسيطة BY القيام به:

SELECT Tag, COUNT(Tag) FROM Tags GROUP BY Tag

ولقد كتبت بعض LINQ الذي يعمل:

var groups = from t in DataContext.Tags
             group t by t.Tag into g
             select new { Tag = g.Key, Frequency = g.Count() };
return groups.OrderByDescending(g => g.Frequency).Take(25);

ومثل، حقا؟ أليس هذا الضخمة مطول؟ الشيء المحزن هو أنني أفعل هذا لتوفير عدد هائل من الاستفسارات، كما بلدي الأشياء بطاقة تحتوي بالفعل على خاصية التردد التي من شأنها أن تحتاج إلا إلى التحقق مرة أخرى مع قاعدة البيانات لكل بطاقة إذا كنت فعلا الخاصية.

وهكذا I ثم تحليل هذه الأنواع مجهولة المصدر <م> العودة إلى أشياء العلامات:

groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag()
{
    Tag = t.Tag,
    Frequency = t.Frequency
}));

وأنا مبتدئ LINQ، وهذا لا يبدو الصحيح. تريني كيف انها فعلت حقا.

هل كانت مفيدة؟

المحلول

وأنا متأكد من أنك على صواب. و، فإن SQL التي LINQ يولد وترسل ديسيبل الخاص بك وسوف تبدو تماما مثل SQL كنت بدأت، حتى حين كنت تفعل الكتابة أكثر قليلا، قاعدة البيانات الخاصة بك لا تقوم بأي عمل أكثر من ذلك.

نصائح أخرى

إذا كنت تريد الأشياء الوسم، لماذا لا خلق لهم مباشرة من الاستعلام ينق بك؟

var groups = from t in DataContext.Tags
             group t by t.Tag into g
             select new Tag() { Tag = g.Key, Frequency = g.Count() };

return groups.OrderByDescending(g => g.Frequency).Take(25);

إذا كنت تستخدم شكل مطول بناء الجملة، وشفرة لديك مطول. وإليك البديل:

List<Tag> result = 
  db.Tags
  .GroupBy(t => t.Tag)
  .Select(g => new {Tag = g.Key, Frequency = g.Count()})
  .OrderByDescending(t => t.Frequency)
  .Take(25)
  .ToList()
  .Select(t => new Tag(){Tag = t.Tag, Frequency = t.Frequency})
  .ToList();

وأعتقد أنك أيضا من الظلم في هذا الاستعلام SQL الخاص بك لا تفعل الشيء نفسه استعلام LINQ الخاص بك - أنها لا يرجع أفضل 25

.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top