簡體   English   中英

如何使用LINQ執行查詢,該查詢必須使一列與眾不同但包括另一列的所有信息

[英]How to perform a query using LINQ that must make one column distinct but includes all information of another column

我目前正在為一個班級分配作業,該班級使用LINQ從數據庫中獲取信息,其中包含以下內容:

..StudentName .. | ..Class .. | ..GPA .. | ..... Course ........... CourseNumber .. | ..FinalGrade .. | ..CSCIGPA ..
......“ D,卡拉” ..... | .... SR .... | ... 3.8 ... | ... CSCI4220 ... | ....... ..... 4220 ......... | ........... A ......... | ........ 3.9 ... ...
......“ D,卡拉” ..... | .... SR ..... | ... 3.8 ... | ... CSCI3110 ... | ...... ..... 3110 .......... | .......... A .......... | ........ 3.9 .. ....
....“ R,Cisco” ..... | .... JR ..... | ... 3.1 ... | ... CSCI3010 ... | ........ ... 3030 .......... | .......... B .......... | ........ 3.4 .... ..
....“ R,Cisco” ..... | .... JR ..... | ... 3.1 ... | ... CSCI2070 ... | ........ ... 2070 .......... | ........ C .......... | ........ 3.4 .... ..
....“ R,Cisco” ..... | .... JR ..... | ... 3.1 ... | ... CSCI3030 ... | ........ ... 3030 .......... | .......... B .......... | ........ 3.4 .... ..
....“ A,Barry” ... | ..FR ..... | ... 4.0 ... | ... CSCI1010 ... | ....... .... 1010 .......... | .......... A .......... | ........ 4.0 ... ...
....“ A,Barry” ... | .... FR ..... | ... 4.0 ... | ... CSCI2010 ... | ....... .... 2010 .......... | .......... A .......... | ........ 4.0 ... ...
....“ Q,Oliver” ..... | .... SO .... | ... 2.7 ... | ... CSCI2020 ... | ......... ..2010 .......... | ........ C .......... | ........ 2.8 ..... 。
....“ Q,Oliver” ..... | .... SO .... | ... 2.7 ... | ... CSCI2020 ... | ......... ..2010 .......... | ........ C .......... | ........ 2.8 ..... 。
....“ Q,奧利弗... | .... SO .... | ... 2.7 ... | ... CSCI2030 ... | ......... ..2030 ........... | .......... C .......... | ........ 2.8 ..... 。
......“ H,羅伊” ... | .... SO .... | ... 3.8 ... | ... CSCI2020 ... | ...... ..... 2020 ........... | .......... A .......... | ........ 3.7。 .....

我沒有包括所有的列,但這是一個很好的示例。 給定此輸入,查詢應返回按GPA(從大到小)順序排列的每個班級(FR,SO,JR,高級)的學生列表,然后由CSCIGPA(從大到小)順序排列。 此外,要顯示的每個學生都應具有串聯的“課程”和“最終成績”,並且每個串聯的課程和最終成績也應包括在列表中。 例如,顯示“ A,Barry”的記錄為:

“ A,Barry”,FR,4.0,CSCI1010A CSCI2010A,4.0

注意:“課程編號”列中的個別課程編號“ 1010和2010”不是輸出的一部分。

我最大的問題是弄清楚如何將簡化的課程和最終成績納入單個學生行(當我執行Distinct()時,它除第一門課程外,還摘走了所有不同的課程和成績)。 這是我編寫的一些代碼,但是我會承認它不是很好,並且可能已經解決了這個問題,因為我已經描述了它。

//method to iterate over all students within student table public IEnumerable<Student> GetAllStudents() { var myquery = databaseEDM.Students .OrderBy(x => x.Class).ThenByDescending(x => x.GPA).ThenByDescending(x => x.CSCIGPA) .ToList().Distinct(); return myquery; }

在執行此任務之前,我從未真正對數據庫或查詢執行任何操作,因此,我們將不勝感激。 如果需要更多信息以獲取正確答案,請告訴我。 謝謝。

其他說明:這只是一個簡單的控制台應用程序,可從數據庫獲取信息並輸出。

這是您的工作示例:

        public IEnumerable<Student> GetAllStudents()
        {
            var myquery = databaseEDM.Students
                .GroupBy(x => new { x.StudentName, x.Class })
                .Select(s => new
                {
                    StudentName = s.Key.StudentName,
                    Class = s.Key.Class,
                    GPA = s.Average(g => g.GPA),
                    Courses = string.Join(" ", s.Select(c => c.Course + c.FinalGrade)),
                    CSCIGPA = s.Average(cs => cs.CSCIGPA)
                })
                .OrderBy(x => x.Class)
                .ThenByDescending(x => x.GPA)
                .ThenByDescending(x => x.CSCIGPA)
                .ToList()
                .Distinct();
            return myquery;
        }

我做了什么?

我按StudentNameClass將學生分組。

然后,我僅選擇您在示例中請求的屬性。

然后,由於每個組我平均GPA

然后,我加入了該CourseFinalGrade ,因為您想要一個值。

最后,我為小組創建了平均CSCIGPA

希望我能正確理解您的問題。 數據的格式不是最好的格式,但是此查詢應該有所幫助。

您的代碼需要一個學生班,而您發布的代碼中沒有學生班。 在下面的代碼中,我期望結果在數據表中(您可以從數據適配器獲得)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("StudentName", typeof(string));
            dt.Columns.Add("Class", typeof(string));
            dt.Columns.Add("GPA", typeof(decimal));
            dt.Columns.Add("Course", typeof(string));
            dt.Columns.Add("CourseNumber", typeof(int));
            dt.Columns.Add("FinalGrade", typeof(string));
            dt.Columns.Add("CSCIGPA", typeof(decimal));

            dt.Rows.Add(new object[] {"D, Kara","SR",3.8,"CSCI4220",4220,"A",3.9});
            dt.Rows.Add(new object[] {"D, Kara","SR",3.8,"CSCI3110",3110,"A",3.9});
            dt.Rows.Add(new object[] {"R, Cisco","JR",3.1,"CSCI3010",3030,"B",3.4});
            dt.Rows.Add(new object[] {"R, Cisco","JR",3.1,"CSCI2070",2070,"C",3.4});
            dt.Rows.Add(new object[] {"R, Cisco","JR",3.1,"CSCI3030",3030,"B",3.4});
            dt.Rows.Add(new object[] {"A, Barry","FR",4.0,"CSCI1010",1010,"A",4.0});
            dt.Rows.Add(new object[] {"A, Barry","FR",4.0,"CSCI2010",2010,"A",4.0});
            dt.Rows.Add(new object[] {"Q, Oliver","SO",2.7,"CSCI2020",2010,"C",2.8});
            dt.Rows.Add(new object[] {"Q, Oliver","SO",2.7,"CSCI2020",2010,"C",2.8});
            dt.Rows.Add(new object[] {"Q, Oliver","SO",2.7,"CSCI2030",2030,"C",2.8});
            dt.Rows.Add(new object[] { "H, Roy", "SO", 3.8, "CSCI2020", 2020, "A", 3.7 });

            var myquery = dt.AsEnumerable()
               .OrderBy(x => x.Field<string>("Class")).ThenByDescending(x => x.Field<decimal>("GPA")).ThenByDescending(x => x.Field<decimal>("CSCIGPA")).ToList();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM