簡體   English   中英

c#LINQ查詢填充元組列表

[英]c# LINQ query filling a Tuple List

我需要在Linq to Entities的幫助下,使用MSSQL數據庫中的值填充元組列表。 下面的代碼段將有助於獲得一個元組列表,其中1個數據庫行反映了1個元組條目。 如果為calculateData有3行,我們將在該列表中使用Field1Field4創建3個元組條目。

下面的代碼使之成為可能:

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個數據庫行。 例:

數據庫每行包含4列(Column1,Column2,Column3,Column4)。
我們有3行。

元組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

所以這里的區別在於,數據庫行和元組之間沒有1:1映射。 我需要從1個數據庫行中創建幾個元組。 在上面的示例中,我們有3個Tuple條目,但它可以不同,也可以更多或更少。

我想這樣的事情應該適合您:

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”循環的備用版本應以相同的方式工作,但不會創建元組的冗余數組:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM