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();