LINQ:如何按相关表中的数据过滤集合

时间:2018-06-15 00:31:28

标签: linq entity-framework-core

我有两个Entity Framework Core实体:

public class JobOrder {
    public int Id { get; set; }
    public string JobTitle { get; set; }
    public string Status { get; set; }
    ...
    public IEnumerable<JobOrderUser> JobOrderUsers { get; set; }
    }

public class JobOrderUser {
        public int AppUserId { get; set; }
        public AppUser User { get; set; }
        public int JobOrderId { get; set; }
        public JobOrder JobOrder { get; set; }
}

第二个是用于JobOrder和User表之间多对多的连接表,但我不需要钻取到User表。

我想获得一个与特定用户有关联的JobOrders集合。在SQL中,我会写这样的东西:

select distinct
    a.*
from
    JobOrders a
    join JobOrderUser b on a.JobOrderID = b.JobOrderId
where
    b.AppUserId = someId

如何使用LINQ方法语法?

2 个答案:

答案 0 :(得分:0)

如果您的实体设置正确且关系完好无损,则可以在查询JobOrderUsers时加载JobOrder,然后由用户进行过滤。像

这样的东西
JobOrder.Include(t => t.JobOrderUsers).Where(t => t.JobOrderUsers.Any(x => x.User.Id == SomeId));

答案 1 :(得分:0)

您还可以使用Select类中的连接和jobOrdersDto所需列数据来使用以下查询。为此,您必须将_jobOrdersRepository_jobOrderUserRepository存储库注入您调用所需方法的服务。

var result = (from jobOrders  in _jobOrdersRepository.GetAll()
                    join jobOrderUser  in _jobOrderUserRepository.GetAll() on jobOrders.JobOrderID equals jobOrderUser.JobOrderId
                    where
                    (jobOrderUser.AppUserId == someId)
                    select new jobOrdersDto
                    {

                    }

您的服务类:

public class YourService
{
    private readonly IRepository<jobOrders> _jobOrdersRepository;
    private readonly IRepository<jobOrderUser> _jobOrderUserRepository;


    public YourService(
       IRepository<jobOrders> jobOrdersRepository, IRepository<jobOrderUser> jobOrderUserRepository)
       : base()
    {
        _jobOrdersRepository = jobOrdersRepository;
        _jobOrderUserRepository = jobOrderUserRepository;
    }
}