سؤال

وهذا هو السؤال أكثر مباشرة نابعة من السابق <لأ href = "https://stackoverflow.com/questions/828356/allowing-a-user-to-create-a-custom-query-of-a- الجدول / "> السؤال أعم كان لي في وقت سابق الآن أن لدي قضاء المزيد من الوقت تبحث في ADO.NET

وأريد أن تأخذ ADO.NET DataTable ووأداء ما يعادل استعلام SQL SELECT مع دالات التجميع (مثل SUM) على بعض الأعمدة، وGROUP BY مجموعة الأعمدة المتبقية. وبعد ذلك تريد أن تأخذ النتيجة وعرضه في DataGrid.

وأنا أفهم أن يمكنني إنشاء DataView من DataTable والتي تحتوي على معايير التصفية وظائف الكلية. ولكن الصفحة MSDN على التعبير القول بأن

"إذا كنت تستخدم جدول واحد لخلق مجموع المباراتين، لن يكون هناك أي فريق من قبل وظيفة. وبدلا من ذلك، فإن جميع الصفوف عرض نفس القيمة في العمود."

وكيف يمكنني الحصول على GROUP BY نوع الوظيفة من ADO.NET دون كتابة الجدول جهدي لقاعدة بيانات منفصلة وتشغيل استعلام هناك؟ هل هناك طريقة للقيام بذلك عن طريق إنشاء أو باستخدام الجدول الثاني؟

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

المحلول

ويمكنك استخدام قدرة تجميع من LINQ لتحقيق ذلك. أيضا، يمكنك ربط DataGrid إلى استعلام LINQ، ولكن سيتم قراءة البيانات فقط.

وبحث على شبكة الإنترنت لLINQ التجمع يجب أن تحصل أين أنت ذاهب.

نصائح أخرى

واحد وسيلة من حوله، هو دورك LINQ نتيجة الاستعلام إلى استخدام انعكاس DataTable و. هنا مثال. وبمجرد الانتهاء من DataTable و، سيكون لديك groupby الكامل، الترحيل، الخ ...

    private static System.Data.DataTable ObjectArrayToDataTable(object[] data)
    {
        System.Data.DataTable dt = new System.Data.DataTable();
        // if data is empty, return an empty table
        if (data.Length == 0) return dt;

        Type t = data[0].GetType();
        System.Reflection.PropertyInfo[] piList = t.GetProperties();

        foreach (System.Reflection.PropertyInfo p in piList)
        {
            dt.Columns.Add(new System.Data.DataColumn(p.Name, p.PropertyType));
        }

        object[] row = new object[piList.Length];

        foreach (object obj in data)
        {
            int i = 0;
            foreach (System.Reflection.PropertyInfo pi in piList)
            {
                row[i++] = pi.GetValue(obj, null);
            }
            dt.Rows.Add(row);
        }

        return dt;
    }

    internal static DataTable GetAllStoredFileDetailsByUserID(int userID)
    {
        var db = GetDataContext();
        object[] result;
        try
        {
            result = (from files in db.Files
                      where files.OwnerUserID == userID && files.IsThumbnail == false
                      select new
                      {
                          FileID = files.FileID,
                          Name = files.Name,
                          DateCreated = files.DateCreated,
                          Size = files.Size,
                          FileHits = (from act in db.FileWebActivities where act.FileID == files.FileID select act).Count()
                      }).ToArray();
        }
        catch (Exception)
        {
           //omitted
        }
        return ObjectArrayToDataTable(result);
    }

إليك كيفية القيام بذلك باستخدام 3.X NET و فوق (LINQ):

HTTP: //codecorner.galanter صافي / 2009/12/17 / تجمع-اللغط-صافي DataTable وباستخدام-LINQ /

وهذا هو كيف نفعل ذلك باستخدام .NET Framework 2.0 وأقل من (ADP.NET قياسي)

HTTP: // codecorner .galanter.net / 2009/04/20 / مجموعة على حدة والمجاميع في صافي DataTable و/

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