C#LINQ查询填充元组列表 [英] c# LINQ query filling a Tuple List
问题描述
我需要在Linq to Entities的帮助下使用MSSQL数据库中的值填充元组列表.下面的代码片段将有助于获得一个元组列表,其中1个数据库行反映了1个元组条目.如果为calculateData有3行,我们将在该列表中使用Field1
至Field4
创建3个元组条目.
I need to fill a Tuple-List with values from a MSSQL-Database with help of Linq to Entities. The code snippet below will help to get a Tuple-List where 1 Database row reflects 1 Tuple Entry. In case there are 3 rows for calculateData we would get 3 Tuple Entries in that list created with Field1
to Field4
.
下面的代码使之成为可能:
The code below makes it possible:
var queryResult = (from a in calculate
join b in calculateData on a.Id equals b.CalcId into c
where a.SpecialID == 2023 && a.VersionId == 1
orderby a.InternalOrderNr ascending
select new
{
a.Field1,
a.Field2,
a.Field3,
myField4 = c.Select(d => new {
d.Field1, d.Field2, d.Field3, d.Field4})
}).ToList();
var result = queryResult.Select(r => new Storage
{
myField1 = r.Field1,
myField2 = r.Field2,
myField3 = r.Field3,
myField4 = r.myField4.Select(t => new Tuple<int,int,decimal,string>
(
t.Field1,
t.Field2,
t.Field3,
t.Field4)
).ToList()
});
return result;
但是我需要的有点不同.我在列表中总共9个元组条目中需要这3个数据库行.示例:
But what I need is a bit different. I need for those 3 database rows in total 9 Tuple Entries in the list. Example:
数据库每行包含4列(Column1,Column2,Column3,Column4).
我们有3行.
Database contains 4 Columns (Column1, Column2, Column3, Column4) per row.
And we have 3 Rows.
元组1:DB-Row1和Column1,Column2、0、0
元组2:DB-Row1和Columm2,列3,0,1
元组3:DB-Row1和Columm3,列4,0,2
元组4:DB-Row2和Column1,Column2、1、0
元组5:DB-Row2和Columm2,列3,1,1
元组6:DB-Row2和Columm3,列4,1,2
元组7:DB-Row3和Column1,Column2、2、0
元组8:DB-Row3和Columm2,列3,2,1
元组9:DB-Row3和Columm3,列4,2,2
Tuple 1: DB-Row1 and Column1, Column2, 0, 0
Tuple 2: DB-Row1 and Columm2, Column3 ,0 ,1
Tuple 3: DB-Row1 and Columm3, Column4 ,0 ,2
Tuple 4: DB-Row2 and Column1, Column2, 1, 0
Tuple 5: DB-Row2 and Columm2, Column3 ,1 ,1
Tuple 6: DB-Row2 and Columm3, Column4 ,1 ,2
Tuple 7: DB-Row3 and Column1, Column2, 2, 0
Tuple 8: DB-Row3 and Columm2, Column3 ,2 ,1
Tuple 9: DB-Row3 and Columm3, Column4 ,2 ,2
所以这里的区别在于,数据库行和元组之间没有1:1的映射.我需要从1个数据库行中创建几个元组.在上面的示例中,我们有3个元组条目,但可以有所不同,也可以更多或更少.
So the difference here is that there is not a 1:1 Mapping between database row and Tuple. I need to make several Tuple out of 1 Database row. In the example above we have 3 Tuple entries, but it can differ and can be more or less.
推荐答案
我猜类似的东西应该对您有用:
I guess something like this should work for you:
var queryResult = (from a in calculate
join b in calculateData on a.Id equals b.CalcId into c
where a.SpecialID == 2023 && a.VersionId == 1
orderby a.InternalOrderNr ascending
select new
{
a.Field1,
a.Field2,
a.Field3,
myField4 = c.Select(d => new {
d.Field1, d.Field2,
d.Field3, d.Field4
d.Field5, d.Field6})
}).ToList();
var result = queryResult.Select(r => new Storage
{
myField1 = r.Field1,
myField2 = r.Field2,
myField3 = r.Field3,
myField4 = r.myField4.SelectMany(t => new []
{
Tuple<int,int>(t.Field1, t.Field2),
Tuple<int,int>(t.Field3, t.Field4),
Tuple<int,int>(t.Field5, t.Field6)
}).ToList()
}).ToList();
return result;
具有双'foreach'循环的替代版本应以相同的方式工作,但不会创建元组的冗余数组:
Alternative version with double 'foreach' loop should work in the same way but it will not create redundant arrays of tuples:
var queryResult = (from a in calculate
join b in calculateData on a.Id equals b.CalcId into c
where a.SpecialID == 2023 && a.VersionId == 1
orderby a.InternalOrderNr ascending
select new
{
a.Field1,
a.Field2,
a.Field3,
myField4 = c.Select(d => new {
d.Field1, d.Field2,
d.Field3, d.Field4
d.Field5, d.Field6})
}).ToList();
var result = new List<Storage>();
foreach(var row in queryResult){
var storage = new Strorage
{
myField1 = r.Field1,
myField2 = r.Field2,
myField3 = r.Field3,
myField4 = new List<Tuple<int,int>>()
};
foreach(var subRow in row.myField4)
{
storage.myField4.Add(Tuple<int,int>(t.Field1, t.Field2));
storage.myField4.Add(Tuple<int,int>(t.Field3, t.Field4));
storage.myField4.Add(Tuple<int,int>(t.Field5, t.Field6));
}
}
return result;
这篇关于C#LINQ查询填充元组列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!