如题,大多数网上关于 LINQ Join 的示例都是以 from x in TableA join ... 这样的形式,这种有好处,也有劣势,就是在比如我们使用的框架如果已经封装了很多方法,比如分页方法。而我们的业务方法只需要在 Service 层调用框架的分页方法,同时注入条件拼接的委托就可以了。而这时候,为了简单,就会以调用 Join() 方法来实现关联查询,外部看起来好像是子查询,而实际上 Entity Framework 生成 SQL 时,还是会以 Inner join 的形式来生成 SQL 语句,但不管怎样,我们还是解决了我们的实际需求,也就可以说成功了。
1. 数据库
假设有 2 张表。Person 表和 City 表。Person 表的 CityID 关联 City 表的 ID。
City 表:
Person 表:
2. 需求
现在,前台界面有一个 checkbox 复选框组,列出所有的城市,然后用户可以选择一个或多个,比如“深圳”和“北京”,分页列出对应的人员。注意,前台界面只需要列出 Person 的 Id 和 Name 就可以了,不需要列出城市的名称。
3. 代码
PersonQueryCondition.cs
public class PersonQueryCondition
public IEnumerable<string> CityNameList { get; set; }
PersonService.cs
public class PersonService : IPersonService
private readonly IRepository<Person> _personRepository;
private readonly IRepository<City> _cityRepository;
public PersonService(IRepository<Person> personRepository,
IRepository<City> cityRepository
this._personRepository = personRepository;
this._cityRepository = cityRepository;
/// <summary>
/// 根据城市名称列表获取分页实体
/// </summary>
/// <param name="cityIdList"></param>
/// <returns></returns>
public List<Person> GetPagedList(PersonQueryCondition queryCondition, int pageIndex, int pageSize, out int recordCount)
return this._personRepository.GetListPagedByCondition<PersonQueryCondition>(c => c.Id > 0,
CombineQuery,
queryCondition,
pageIndex,
pageSize,
out recordCount);
protected virtual IQueryable<Person> CombineQuery(IQueryable<Person> query, PersonQueryCondition queryCondition)
if (queryCondition == null)
return query;
if (queryCondition.CityNameList != null && queryCondition.CityNameList.Any())
query = query.Join(_cityRepository.Table, p => p.CityID, c => c.Id, (p, c) => new { Person = p, City = c })
.Where(a => queryCondition.CityNameList.Contains(a.City.Name))
.Select(c => c.Person)
.Distinct();
return query;
请注意:如果 Person 和 City 是多对多的关系,即一个用户可以在多个城市生活,一个城市也可以有多个用户。那么如果要筛选即在 “深圳” 生活的人,又曾经在 “北京” 生活过的人,则 LINQ 的语句需要更改为:
if (queryCondition.CityNameList != null && queryCondition.CityNameList.Any())
//这里需要循环嵌套 Join 来实现
foreach (string cityNameItem in queryCondition.CityNameList)
query = query.Join(_cityRepository.Table, p => p.CityID, c => c.Id, (p, c) => new { Person = p, City = c })
.Where(a => a.City.Name == cityNameItem) // 注意:这里不再是调用 .Contains 方法,而是直接等于判断。
.Select(c => c.Person)
.Distinct();
return query;
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[CityID] AS [CityID]
[dbo].[Person] AS [Extent1]
INNER JOIN [dbo].[City] AS [Extent2] ON [Extent1].[CityID] = [Extent2].[Id]
WHERE
[Extent1].[Id] > 0
[Extent2].[Name] IN (N'深圳', N'北京')
[Extent2].[Name] IS NOT NULL
谢谢浏览!
转载于:https://www.cnblogs.com/Music/p/linq-join-sample.html
如题,大多数网上关于 LINQ Join 的示例都是以 from x in TableA join ... 这样的形式,这种有好处,也有劣势,就是在比如我们使用的框架如果已经封装了很多方法,比如分页方法。而我们的业务方法只需要在 Service 层调用框架的分页方法,同时注入条件拼接的委托就可以了。而这时候,为了简单,就会以调用 Join() 方法来实现关联查询,外部看起来好像是子查询,而实际上...
from order in db.T_ClientWorkOrder
work in db.T_ClientWorkOrder_Work on order.ID equals work.FK_OrderId
nodeconfig in db.T_ClientWorkOrder_NodeConfig on new { key1 = work.NodeKey, key2 = order.ProjectId } equals new { key1 =
对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行join时直接into到集合变量就可以了,但在赋值时,如果只需要集合的一条记录,那在写法上又会有两种,而这两种写法所产生的性能是相关千里的,下面来看一下.
首先是SQL的左外连接
SELECT...
DateTime bdate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
DateTime edate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
var list = from Check in db.O_Check
EF和LINQ改变了原有的手写SQL时期的一些编码方法,并且增强了各数据库之间的移植性简化了开发时的代码量和难度,由于很多人不熟,经常会碰到一些写SQL语句时经常会用到的一些方法,而使用EF或LINQ确不知道如何使用,其实EF和LINQ帮我们想到的有很多,看大家如何利用好,下面讲几个项目开发中碰到过的问题吧
1、经常开发中会碰到查询一个包含在一个数组中的列表
例如:select...
EF中多表联结查询只实现了inner join并没有实现left join,但是在实际的业务中需要用到left join的情况是很常见的。那么我们可以通过设置左表之外的表查询无记录时返回默认值即可。具体参见以下代码。
EF代码:
var order = (from a in context.Set()
join bus in context.Set() on a.Business