有没有办法循环使用我的sql结果并将某些名称/值对存储在C#中的其他位置?
我有一个很大的结果集,来自一个非常复杂的SQL查询。这些值中有一个有没有办法循环使用我的sql结果并将某些名称/值对存储在C#中的其他位置?,c#,sql,linq,list,webmatrix,C#,Sql,Linq,List,Webmatrix,我有一个很大的结果集,来自一个非常复杂的SQL查询。这些值中有一个字符串,它表示一个位置(稍后将帮助我确定该值来自的页面位置),一个int,它是根据行中的其他值为每行计算的优先级编号,还有另一个字符串,其中包含一个我必须记住的值,以便以后显示 问题是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();