代码之家  ›  专栏  ›  技术社区  ›  Alex

LINQ:如何按相关表中的数据筛选集合

  •  1
  • Alex  · 技术社区  · 6 年前

    我有两个实体框架核心实体:

    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和用户表之间用于多对多的连接表,但我不需要为此钻取到用户表。

    我想得到一组与特定用户有关联的工单。在sql中,我将编写如下内容:

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

    如何使用linq方法语法来实现这一点?

    2 回复  |  直到 6 年前
        1
  •  0
  •   ekh    6 年前

    如果实体设置正确,并且它们的关系完好无损,则可以加载 JobOrderUsers 在查询 JobOrder 然后按用户筛选。有点像

    JobOrder.Include(t => t.JobOrderUsers).Where(t => t.JobOrderUsers.Any(x => x.User.Id == SomeId));
    
        2
  •  0
  •   Vivek Nuna Chetan sabhaya    6 年前

    您还可以使用join和 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;
        }
    }