Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq在记录数较多的表上左联接_Linq - Fatal编程技术网

Linq在记录数较多的表上左联接

Linq在记录数较多的表上左联接,linq,Linq,我有两个数据来源: public class Person { public int Id { get; set; } public string Name { get; set; } } public class Employee { public int Id { get; set; } public string Name { get; set; } } 并填充一些数据,如: var data1 = new List<Person>() {

我有两个数据来源:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
}
并填充一些数据,如:

 var data1 = new List<Person>() { new Person() { Id = 1, Name = "data 11" }, new Person() { Id = 2, Name = "data 12" } };

 var data2 = new List<Employee>() { new Employee() { Id = 1, Name = "data 21" }, new Employee() { Id = 2, Name = "data 22" }, new Employee() { Id = 3, Name = "data 23" } };
现在我的问题是: --我想让Parent或“from source”成为具有更高计数的数据源

场景如下:如果data1.Count>data2.Count,则: 同上查询

如果data2.Count>data1.Count,则:

                      var query =  (from employee in (data2)
                        join person in (data1) on employee.Id equals                       
                         person.Id
                            into temp
                        from y in temp.DefaultIfEmpty()
                        select new { Data = y }).ToList();
既然Linq没有在Linq中提供开箱即用的右连接,我如何实现这一点?
请指导。

如果您可以定义两个实体都实现的接口,那么您可以基于此接口编写查询:

  interface INameIdPair {
    int Id { get; set; }
    string Name { get; set; }
  }

  public class Person : INameIdPair {
    public int Id { get; set; }
    public string Name { get; set; }
  }

  public class Employee : INameIdPair {
    public int Id { get; set; }
    public string Name { get; set; }
  }

  var data1 = new List<INameIdPair> {
    new Person { Id = 1, Name = "data 11" },
    new Person { Id = 2, Name = "data 12" }
  };

  var data2 = new List<INameIdPair> {
    new Employee { Id = 1, Name = "data 21" },
    new Employee { Id = 2, Name = "data 22" },
    new Employee { Id = 3, Name = "data 23" }
  };

  var from1 = data1.Count > data2.Count ? data1 : data2;
  var from2 = from1 == data1 ? data2 : data1;

  var query =
    (from ff1 in from1
      join ff2 in from2 on ff1.Id equals ff2.Id
        into temp
      from y in temp.DefaultIfEmpty()
      select new {Data = y}
      ).ToList();
<代码>接口InAMIDPair{ int Id{get;set;} 字符串名称{get;set;} } 公众人物:INameIdPair{ 公共int Id{get;set;} 公共字符串名称{get;set;} } 公共类员工:INameIdPair{ 公共int Id{get;set;} 公共字符串名称{get;set;} } var data1=新列表{ 新人{Id=1,Name=“data 11”}, 新人{Id=2,Name=“data 12”} }; var data2=新列表{ 新员工{Id=1,Name=“data 21”}, 新员工{Id=2,Name=“data 22”}, 新员工{Id=3,Name=“data 23”} }; var from1=data1.Count>data2.Count?data1:data2; 变量from2=from1==data1?数据2:data1; 变量查询= (从ff1到from 1 在ff1.Id等于ff2.Id的from2中加入ff2 变成临时工 从临时DefaultIfEmpty()中的y开始 选择新建{Data=y} ).ToList();
首先计算长度,然后确定查询。是的,这当然是一种方法,但我正在寻找一些通用的解决方案(如果可用)。LINQ提供了一种以类似SQL的方式查询集合的方法。而不是计算集合和执行联接的方法。:)嗯……这在这里很管用。但我有复杂的数据结构,两个模型都有不同的属性。不过它仍然可以工作。@AnkurMore一般来说,您应该能够定义一个接口,以便能够表达连接条件。这将允许根据记录的数量切换两个数据源,并通用地表示查询。您可能需要定义另一个接口或使用动态对象(ExpandooObject)来表示结果。感谢HashPsi的建议。
  interface INameIdPair {
    int Id { get; set; }
    string Name { get; set; }
  }

  public class Person : INameIdPair {
    public int Id { get; set; }
    public string Name { get; set; }
  }

  public class Employee : INameIdPair {
    public int Id { get; set; }
    public string Name { get; set; }
  }

  var data1 = new List<INameIdPair> {
    new Person { Id = 1, Name = "data 11" },
    new Person { Id = 2, Name = "data 12" }
  };

  var data2 = new List<INameIdPair> {
    new Employee { Id = 1, Name = "data 21" },
    new Employee { Id = 2, Name = "data 22" },
    new Employee { Id = 3, Name = "data 23" }
  };

  var from1 = data1.Count > data2.Count ? data1 : data2;
  var from2 = from1 == data1 ? data2 : data1;

  var query =
    (from ff1 in from1
      join ff2 in from2 on ff1.Id equals ff2.Id
        into temp
      from y in temp.DefaultIfEmpty()
      select new {Data = y}
      ).ToList();