【问题标题】:C# - Combining matching results from SQL result setC# - 组合来自 SQL 结果集的匹配结果
【发布时间】:2016-07-19 02:24:57
【问题描述】:

假设我在 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 在这种情况下实际上不起作用,但我需要类似的东西。

【问题讨论】:

  • 为什么你的项目要求你设计的程序很糟糕,并且在应用层做应该在数据库中完成的工作?
  • 因为我实际上并不负责我正在使用的数据集。我有一个需要能够运行的查询,它返回一个像我的示例一样的数据集。我很清楚这是一个可怕的 PITA,但我必须使用我所拥有的。
  • 这很粗糙。好吧,告诉您的 DBA 和/或数据管理员,他们对我的工作不擅长
  • 哈哈!我会马上解决的......

标签: c# sql-server


【解决方案1】:

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

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();

【讨论】:

  • 这个看起来很有希望,我去测试一下。
  • ...它的工作原理!这是一个令人讨厌的问题的可爱而优雅的解决方案。非常感谢!
【解决方案2】:

你不能sum meals 因为你会得到一个数字,但你可以按name 列分组并得到一个汇总meals 的表格:

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

但如果它对你的具体问题不起作用,你应该解释更多。

如果你真的想在这种情况下使用.Contain(),那么你只需要在你的MyEnumerable类中实现IEquatable&lt;Part&gt;,就像here说的那样,你也可以看到here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多