1

这似乎很容易,但我无法集中注意力。
假设我有 2 个这样定义的类:

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

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

有定义IEnumerable<Class1> result1IEnumerable<Class2> result2填充数据。

我有这样定义的第三个类:

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

我想要一个 LINQ 查询,它从第一个结果中选择一些字段,从第二个结果中选择一些字段,并将它们放入定义为List<ResultClass> result.
例如,如果我有这样result1填充的第一个结果 ():

  Document    Amount
     1         1.55
     2         2.55

第二个结果 ( 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语句来执行此操作,如下所示:

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 语句中执行此操作可能没有真正的好处,因为它会这样做。
但是,我正在寻找性能改进,result1实际上result2是来自 LINQ-to-Entities 的 IQueryables,在某种程度上,我可以这样做:

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对象并连接两个结果枚举:

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

根据您需要的输出,似乎您需要一个 Union

        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 回答