【LINQ笔记】join案例
实体
public class Person
{
public string Name { get; set; }
public int CompanyID { get; set; }
}
public class Company
{
public int ID { get; set; }
}
public class JoinResult
{
public int CompanyID { get; set; }
public string PersonName { get; set; }
}
List<Company> companyList = new List<Company> {
new Company{ ID=1},
new Company{ ID=2},
new Company{ ID=3}
};
List<Person> personList = new List<Person> {
new Person{ CompanyID=1,Name="zhangsan"},
new Person{ CompanyID=1,Name="lisi"},
new Person{ CompanyID=2,Name="wangwu"}
};
内连接
var list1 = from c in companyList
join p in personList on c.ID equals p.CompanyID
select new { CompanyID = c.ID, PersonName = p.Name };
内连接第二种方法:
var list2 = companyList.Join<Company, Person, int, JoinResult>(personList, c => c.ID, p => p.CompanyID, (c, p) => {
return new JoinResult { CompanyID = c.ID, PersonName = p.Name };
}).ToList();
左连接
personList的数据放入临时变量personTempList中,并调用DefaultIfEmpty(),意思是为空就使用默认值
var leftJoinList = from c in companyList
join p in personList on c.ID equals p.CompanyID into personTempList
from pTemp in personTempList.DefaultIfEmpty()
select new { CompanyID = c.ID, PersonName = pTemp?.Name };
也可以指定默认值:
var list1 = from c in companyList
join p in personList on c.ID equals p.CompanyID into personTempList
from pTemp in personTempList.DefaultIfEmpty(new Person { Name="DefaultName"})
select new { CompanyID = c.ID, PersonName = pTemp.Name };
join多个条件
var a = from m in DbContext.Set<T1>()
join q in DbContext.Set<T2>()
on new { m.ID, Phone=m.Phone1 } equals new { q.ID, Phone=q.Phone2 }
select new { m.ID, m.Phone1 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构