C# - 结合SQL结果集的匹配结果

时间:2016-03-30 21:06:20

标签: c# sql-server

假设我在SQL中有一个表格如下:

   record_id|user_id|Name |Meals
   ---------|-------|-----|-----
        1   |   1   |  Bob|1
        2   |   2   |Sally|2
        3   |   3   |Roger|2
        4   |   1   |  Bob|3
        5   |   4   | Joan|1
        6   |   2   |Sally|1

我想在C#中创建一个对象,它总结了多次出现的任何名字的用餐次数:

   user_id| Name|Meals
   -------|-----|-----
      1   |  Bob|4
      2   |Sally|3
      3   |Roger|2
      4   | Joan|1

使问题复杂化的是,由于程序的性质,整个表必须一次性检索,而不是使用SQL语法来总结Bob和Sally的饭菜,然后在C#数据读取器中迭代,并且最后添加到IEnumerable数组。所以我需要一些类似的东西:

List<MyIEnumerable> MyList = new List<MyIEnumberable>();
while(dr.Read()) {
    if(MyList.Contains(Convert.ToInt32(dr[1]))) {
        // Needs to combine the dr record with the existing record in MyList
    }
    else {
        MyIEnumerable PersonEntry = new MyIEnumerable();
        PersonEntry.user_id = Convert.ToInt32(dr[1]);
        PersonEntry.Name = dr[2].ToString();
        PersonEntry.Meals = Convert.ToInt32(dr[3]);
        MyList.Add(PersonEntry);
    }
}

所以你可以看到我想要的逻辑。 .Contains实际上并不适用于这种情况,但我需要类似的东西。

2 个答案:

答案 0 :(得分:2)

您可以使用词典来实现此目的。

Dictionary<int, MyIEnumerable> MyDictionary = new Dictionary<int, MyIEnumerable>();

while (dr.Read()) {
    int myKey = Convert.ToInt32(dr[1]));
    if (MyDictionary.ContainsKey(myKey)) 
    {
        MyDictionary[myKey].Meals += Convert.ToInt32(dr[3]);
    }
    else 
    {
        MyIEnumerable PersonEntry = new MyIEnumerable();
        PersonEntry.user_id = Convert.ToInt32(dr[1]);
        PersonEntry.Name = dr[2].ToString();
        PersonEntry.Meals = Convert.ToInt32(dr[3]);
        MyDictionary.Add(myKey), PersonEntry);
    }
}

通过执行MyDictionary[id] = object它将更新字典中的条目(如果已存在)或添加新条目。

如果您真的想要返回一个列表,那么您可以完成:

List<MyIEnumerable> MyList = MyDictionary.Select(kvp => kvp.Value).ToList();

答案 1 :(得分:0)

您不能sum meals'因为您将获得一个号码,但您可以按name列分组,并获得一个表格,其中meals已汇总:

select user_id, name, sum(meals) 
from datatable 
group by user_id, name, meals 
order by user_id

但如果它不适合您的具体问题,您应该详细解释它。

如果您真的想在此上下文中使用.Contain(),那么您只需在IEquatable<Part>课程中实施MyEnumerable here,您也可以看到group_leader() -> pid() 3}}