2016-04-26 12 views
0

Linq to Entitiesの助けを借りて、MSSQLデータベースの値をタプルリストに入力する必要があります。以下のコードスニペットは、1データベース行に1タプルエントリが反映されたタプルリストを取得するのに役立ちます。 calculateDataに3つの行がある場合、Field1からField4で作成されたそのリストに3つのタプルエントリがあります。タプルリストを埋め込むLINQクエリ

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つのデータベース行が必要です。例:

データベースには、1行に4つの列(列1、列2、列3、列4)が含まれています。
さらに、3つの行があります。

タプル1:DB-行1および列1、列2、0、0
タプル2:DB-行1とColumm2、COLUMN3、0、1
タプル3:DB-行1とColumm3、Column4、0 、2
タプル4:DB-行2及び列1、列2、1、0
タプル5:DB-行2及びColumm2、COLUMN3、1,1
タプル6:DB-行2及びColumm3、Column4、1、2
タプル7:DB-Row3とColumn1,2,2,0, タプル8:DB-Row3とColumm2、Column3,2,1 1
タプル9:データベースの行とタプルの間に1マッピング:DB-ROW3とColumm3、Column4、2、2

だからここでの違いは、1が存在しないことです。私は1つのデータベース行の中からいくつかのタプルを作成する必要があります。上の例では、3つのTupleエントリを持っていますが、それは異なっていても、多少でもかまいません。

+0

'タプル1:DB-Row1とColumn1、Column2、0、0'で0をどういう意味ですか?そして、col1、col2、col0(前の質問を参照)、最初の行のcol0を意味しましたか? – Xiaoy312

+0

0は、たとえば静的な値です。したがって、1つのデータベース行に3つのタプルを作成する必要があります。
Tuple.Creation(Column1、Column2、0、0) – Maik

+0

結果セットの各行から2列の値の可能な組み合わせをそれぞれ2タプルで格納したい場合は、それは正しいと思いますか?このソリューションでは、任意の数の行または列を処理する必要がありますが、常に2タプルが使用されます。 – Zack

答えて

1

私はこのような何かがあなたのために働く必要がありますね:ダブル「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 = 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; 

代替バージョンが同じように動作するはずですが、それはタプルの冗長アレイを作成することはありません。

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; 
関連する問題