我看到下面的帖子对我来说真的很难理解。所以我重新发布它。对不起,如果有人认为它是重复的。我只有简单的要求
C# Joins/Where with Linq and Lambda
我有一个这样的课程
public class Person
{
public int Id{get;set;}
public string Name{get;set;}
public string MailingAddress{get;set;}
}
我有一个类似下面的方法
public IList<Person> GetNames(IList<int> ids)
这将为我提供以下人员名单
1“Sam”“”
2“Dev”“”
4“Hummy”
我有另一种方法,如下面的
public IList<Person> GetMailingAddress(IList<int> ids)
这将为我提供以下人员名单
1“”“ABC”
6“”“TTT”
2“”“XYZ”
现在我需要合并两种方法的结果,这样我才能得到像我这样的最终结果
1“Sam”“ABC”
2“Dev”“XYZ”
更新:对不起,我没有明确提供测试数据。请参阅上面的测试数据
答案 0 :(得分:5)
我对你的方法返回的内容感到有些困惑,如果你需要将两个结果组合起来获得完整的Person
个对象,那么有两种方法可以让你的方法有效。
如果您可以依赖相同数量的对象返回,可以尝试:
names.Zip(mailingAddresses, (n, m) => new Person
{
Id = n.Id,
Name = n.Name,
MailingAddress = m.MailingAddress
});
如果您不能依赖这两种情况,可以使用Join
:
names.Join(mailingAddresses, n => n.Id, m => m.Id, (n, m) => new Person
{
Id = n.Id,
Name = n.Name,
MailingAddress = m.MailingAddress
});
即使您有这两个选项,如果您可以控制实际从数据源获取对象的代码,那么第三个也是更好的选择。如果您知道需要这两个数据,则应创建一个方法,一次查询数据源以获取所有数据,而不是每个数据查询一次。
答案 1 :(得分:1)
Enumerable.Zip肯定会解决您的问题。
答案 2 :(得分:0)
您可以使用Enumerable.Zip和之前订购数据来解决此问题:
IEnumerable<Person> list = GetNames(new List<int>()).OrderBy(p => p.Id).Zip(GetMainlingAddress(new List<int>()).OrderBy(p => p.Id), (first, second) => { return new Person() { Id = first.Id, Name = first.Name, MailingAddress = second.MailingAddress }; });
答案 3 :(得分:0)
对通过Lambda样式Linq语法返回值的这两个方法执行连接:
var query = GetNames().Join(GetMailingAddress(),
n => n.Id,
e => e.Id,
(n, e) => new { n.Id,n.Name,e.Email});
foreach (var item in query)
{
Console.WriteLine(item.Id + "-" + item.Name +"-"+ item.Email);
}
对这两个通过Sql样式的Linq语法返回值的方法执行连接:
var query = from n in GetNames()
join e in GetMailingAddress()
on n.Id equals e.Id
select new {n.Id,n.Name,e.Email };
foreach (var item in query)
{
Console.WriteLine(item.Id + "-" + item.Name +"-"+ item.Email);
}
注意:GetName()和GetMailingAddress()方法返回结果集列表。