有没有办法循环使用我的sql结果并将某些名称/值对存储在C#中的其他位置?

有没有办法循环使用我的sql结果并将某些名称/值对存储在C#中的其他位置?,c#,sql,linq,list,webmatrix,C#,Sql,Linq,List,Webmatrix,我有一个很大的结果集,来自一个非常复杂的SQL查询。这些值中有一个字符串,它表示一个位置(稍后将帮助我确定该值来自的页面位置),一个int,它是根据行中的其他值为每行计算的优先级编号,还有另一个字符串,其中包含一个我必须记住的值,以便以后显示 问题是sql查询太复杂了(它有联合、联接和带别名的复杂计算),我无法在逻辑上将任何其他内容放入其中,而不影响它的工作方式 不过,我只想说,在完成查询和执行计算之后,我需要一些聚合函数可能会解决的问题,但这不是一个选项,因为所有列都不是来自其他聚合函数 我已

我有一个很大的结果集,来自一个非常复杂的SQL查询。这些值中有一个
字符串
,它表示一个位置(稍后将帮助我确定该值来自的页面位置),一个
int
,它是根据行中的其他值为每行计算的优先级编号,还有另一个
字符串
,其中包含一个我必须记住的值,以便以后显示

问题是sql查询太复杂了(它有联合、联接和带别名的复杂计算),我无法在逻辑上将任何其他内容放入其中,而不影响它的工作方式

不过,我只想说,在完成查询和执行计算之后,我需要一些聚合函数可能会解决的问题,但这不是一个选项,因为所有列都不是来自其他聚合函数

我已经绞尽脑汁想了好几天了,想知道如何迭代结果,如何将一对值存储在一个列表中(或者以某种方式将两个单独的列表捆绑在一起),其中一个值是每个位置的所有优先级值的总和,另一个值是不同的位置值(即,当结果循环通过时,它不会创建具有以前使用过的相同位置值的另一个列表项,但是,它仍然需要来自相同位置的所有其他优先级值的总和)。此外,结果需要按优先级降序排列(因此存在使用两个列表的问题)

示例:

编辑:我忘了,保留的值应该是sql查询中优先级最高的行中的值

如果我有以下结果:

  location                      priority                               value  

--------------------------------------------------------------------------------
   page1                           1                                  some text!
   page2                           3                                  more text!
   page2                           4                               even more text!
   page3                           3                                  text again
   page3                           1                                     text
   page3                           1                              still more text!
   page4                           6                                     text
如果我能够做我想做的事情,我将能够在迭代之后(按照这个顺序)实现类似的事情:

我做了一项又一项的研究,但绝对没有什么能真正解决这个难题

我的要求对强大的C语言来说是否太难了

我考虑过的事情:

循环遍历sql结果并检查每个位置是否有重复,在运行时将所有优先级值相加,并将这两个加号存储在两个或三个单独的列表中

为什么我仍然需要帮助

我不能使用foreach,因为逻辑没有平移,我不能使用
for
循环,因为我不能访问IEnumerable(或存储从
数据库返回的内容的任何类型)。Open.Query()
按索引(当然这是有意义的).此外,我需要按优先级排序,但不能使一个列表与其他列表不同步


使用LINQ选择和存储我需要的内容

为什么我仍然需要帮助

我不了解LINQ(一点也不!),主要是因为我不懂lambda表达式(无论我读了多少书)


使用实例化类存储名称/值对

为什么我仍然需要帮助

我不仅期望在这类事情上排序是不可能的,而且现在我在WebMatrix环境下如何在我的C#net网页中使用
.cs
文件,我主要只使用过静态类,还需要一些关于构造函数的复习课程,以及如何正确设置


以某种方式将此功能融入到已经相当大且复杂的SQL查询中

为什么我仍然需要帮助

虽然这可能是我理想的功能所在,但我再次强调,这不是一个选项。我曾尝试使用聚合函数,但只得到一个错误,说明并非所有其他列都来自聚合函数


基于第一个查询结果集中的值进行另一个查询

为什么我仍然需要帮助

我无法仅基于一列(即位置)选择不同的结果


假设我可以得到正确的循环逻辑,将值存储在三维数组中

为什么我仍然需要帮助


我不能声明数组,因为在我需要使用它之前,我不知道它的所有维度。

你的帖子在很多方面让我惊讶,比如说“大多使用静态类”和“希望实例化一个类/对象是不可能的”……你说的真是奇怪。我只能引用Charles Babbage的一句话来回答:

我不能正确地理解可能引发这样一个问题的思想混乱

总之,正如你所说,你觉得lambdas很难,让我们用经典的“手动”方式来追踪这个问题

假设您有一个包含位置和优先级的行列表

List<DataRow> rows = .... ; // datatable, sqldatareader, whatever
或将其转换/重写为列表:

List<string> locList = new List<string>(locations);
Console.WriteLine(locList[2]); // of course, assuming there were at least three..
但是,必须对所有位置进行硬编码是毫无用处的。因此,您还可以询问字典目前知道哪些键

foreach(string key in prioSums.Keys)
    Console.WriteLine(key);
您可以立即使用它:

foreach(string key in prioSums.Keys)
{
    Console.WriteLine(key);
    Console.WriteLine(prioSums[key]);
}
应该打印所有位置及其总和

您可能已经注意到一件有趣的事情:字典可以告诉您它记住了哪些键。因此,不需要第一个目标中的哈希集。只需将字典中的优先级相加,您就可以免费获得位置的统一列表:只需向dict索要其键

编辑:

我注意到您还有一些请求(如排序降序或查找最高优先级值),但我想现在就不谈了。如果你了解我是如何使用字典来收集优先级的,那么你可以很容易地构建一个类似的
字典来收集位置的最高排序值。如果你从字典中取出值并将其作为一个I.e.列表进行排序,那么“降序”就很容易了。所以我现在略过这段文字
List<string> locList = new List<string>(locations);
Console.WriteLine(locList[2]); // of course, assuming there were at least three..
Dictionary<string, double> dict = new Dictionary<string, double>();
dict["mamma"] = 123.45;
double d = dict["mamma"]; // d == 123.45
Dictionary<string, double> dict = new Dictionary<string, double>();
dict["mamma"] = 123.45;
double d = dict["daddy"]; // throws KeyNotBlarghException
Dictionary<string, double> dict = new Dictionary<string, double>();
dict["mamma"] = 123.45;
bool knowIt = dict.ContainsKey("daddy"); // == false
Dictionary<string, double> dict = new Dictionary<string, double>();
bool knowIt = dict.ContainsKey("daddy"); // == false
if( !knowIt )
    dict["daddy"] = 5;

dict["daddy"] += 101; // now 106
Dictionary<string, double> prioSums = new Dictionary<string, double>();
foreach(var row in rows)
{
    string location = (string)rows["LOCATION"];
    double priority  = (double)rows["PRIORITY"];

    if( ! prioSums.ContainsKey(location) )
        // make sure that dictionary knows the location
        prioSums[location] = 0.0;

    prioSums[location] += priority;
}
var sss = prioSums["NewYork"];  // 9123, assuming NewYork was some location
foreach(string key in prioSums.Keys)
    Console.WriteLine(key);
foreach(string key in prioSums.Keys)
{
    Console.WriteLine(key);
    Console.WriteLine(prioSums[key]);
}
var query = from page in pages
    group page by page.location into grp
    select new { location = grp.Key,
                 priority = grp.Sum(page => page.priority),
                 value = grp.OrderByDescending(page => page.priority)
                            .First().value
               }
location  priority  value  
--------------------------------------
page1     1         some text!
page2     3         more text!
          4         even more text!
page3     1         text
          1         still more text!
          3         text again
page4     6         text
result = query.OrderByDescending(x => x.priority).ToList();