1

これはかなり簡単に思えますが、集中できません。
次のように定義された 2 つのクラスがあるとします。

class Class1
{
    public int Document;
    public decimal Amount;
}

class Class2
{
    public string Document;
    public decimal Amount;
}

定義され、データが入力されていIEnumerable<Class1> result1ます。IEnumerable<Class2> result2

次のように定義された 3 番目のクラスがあります。

class ResultClass
{
    public string Document;
    public decimal? AmountFromClass1;
    public decimal? AmountFromClass2;
}

最初の結果からいくつかのフィールドを選択し、2 番目の結果からいくつかのフィールドを選択し、それらを として定義された 3 番目の結果に入れる LINQ クエリが必要ですList<ResultClass> result
たとえば、次のresult1ように入力された最初の結果 ( ) があるとします。

  Document    Amount
     1         1.55
     2         2.55

2 番目の結果 ( result2) は次のように入力されます。

  Document    Amount
   "d-1"        1.22
   "d-2"        2.22

最終的resultに次のように入力したいと思います(順序は関係ありません):

  Document    AmountFromClass1    AmountFromClass2
    "1"             1.55                null
   "d-1"            null                1.22
    "2"             2.55                null
   "d-2"            null                2.22

現在foreach、次のような 2 つのステートメントを使用してこれを行っています。

List<ResultClass> result = new List<ResultClass>();

foreach (var o in result1)
    result.Add(new ResultClass 
    { 
        Document = o.Document.ToString(), 
        AmountFromClass1 = o.Amount, 
        AmountFromClass2 = null 
    });

foreach (var o in result2)
    result.Add(new ResultClass 
    { 
        Document = o.Document, 
        AmountFromClass1 = null, 
        AmountFromClass2 = o.Amount 
    });

しかし、LINQを使用してこれを行いたいと思います。
出来ますか?

編集:質問を絞り込む(エンティティフレームワークタグ も追加)
これは単なるコード例であるため、同じことを行うため、単一のLINQステートメントでこれを行うことには実際の利点がない可能性があることを認識しています。ただし、実際には LINQ-to-Entities の IQueryables
であるパフォーマンスの向上を探しているので、次のようなことができます。result1result2

List<ResultClass> MyFunc()
{
    Database DB = new Database(); // object context
    var result1 = DB.Class1s.Where(...);
    var result2 = DB.Class2s.Where(...);
    return SomeMagic()
        .Select(x => new ResultFunc { ... })
        .ToList();
}
4

3 に答える 3

4

両方のコレクションの各項目をResultClassオブジェクトに射影し、結果として得られる 2 つの列挙型を連結します。

var query1 = from o in result1
             select new ResultClass
             {
                 Document = o.Document.ToString(),
                 AmountFromClass1 = o.Amount
             };

var query2 = from o in result2
             select new ResultClass
             {
                 Document = o.Document,
                 AmountFromClass2 = o.Amount
             };

var result = query1.Concat(query2).ToList();
于 2012-05-25T14:10:07.220 に答える
1

これはLINQに変換されたコードです

var result = result1
  .Select(c => new ResultClass() { Document = c.Document.ToString(), AmountFromClass1 = c.Amount })
  .Concat(result2.Select(c => new ResultClass() { Document = c.Document, AmountFromClass2 = c.Amount }))
  .ToList();
于 2012-05-25T14:16:41.570 に答える
0

必要な出力に基づいて、ユニオンが必要なようです

        var class1 = new List<Class1>();
        var class2 = new List<Class2>();
        class1.Add(new Class1 (){Document=1, Amount = 1.0M});
        class1.Add(new Class1 (){Document=2, Amount = 1.0M});
        class2.Add(new Class2 (){Document="1", Amount = 1.0M});
        class2.Add(new Class2 (){Document="3", Amount = 1.0M});
            var result = class1.Select(x=> new ResultClass{Document = x.Document.ToString(), AmountFromClass1=x.Amount, AmountFromClass2 = null}).Union(
                            class2.Select(x=> new ResultClass{Document = x.Document, AmountFromClass2=x.Amount, AmountFromClass1 = null})   );

クロス結合が必要な場合は、複数の from 句でクエリ構文を使用できます。

于 2012-05-25T14:16:45.283 に答える