LINQ查询以从由三个表连接的表中获取数据

问题描述

我有三个桌子。

  1. organizationalUnit
  2. 用户
  3. 任务

我想从任务表中返回数据,其中授权用户在特定部门中,而用户也在该部门中。 例如,Sally在人事部门。她想查看Jim的任务。吉姆(Jim)也和sally一起在人事部门工作,因此可以查看她的任务。但是,她应该无法像John在销售部门一样查看他的任务。

sub foo ($bar) { return 0 }

use B::Deparse;
$foo = B::Deparse->new->coderef2text(\&foo);

# contents of foo:
# BEGIN {${^WARNING_BITS} = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x55\x50\x55\x50\x51\x01"}
# use feature 'signatures';
# die sprintf("Too many arguments for subroutine at %s line %d.\n",(caller)[1,2]) unless @_ <= 1;
# die sprintf("Too few arguments for subroutine at %s line %d.\n",2]) unless @_ >= 1;
# my $bar = $_[0];
# return 0;

@foo = split /\n/,$foo;
if ($foo[2] =~ /use feature 'signatures'/ &&
        $foo[3] =~ /Too many arguments/ &&
        $foo[4] =~ /Too few arguments/) {
    @sig = ();
    $n = 5;
    do {
        ($sig) = $foo[$n] =~ /my (\W\w+) = /;
        push @sig,$sig if $sig;
        $n++;
    } while ($sig);
    print "Signature is (",join(",",@sig),")\n";
}

当前LINQ代码

organisationalUnit
--------------------
ID     |     name
--------------------
1      |     HR
2      |     Sales




      Users
----------------------------------------
ID     |     name     |  OUID(FK)
----------------------------------------
4      |     Jim      |  1
5      |     Sally    |  1
6      |     John     |  2



      Tasks
----------------------------------------------
ID     |     TaskInfo           |  userID(FK)
-----------------------------------------------
1      |     Task for Jim       |     4
2      |     Task for john      |     5
3      |     Task for Sally     |     6

我现在回想起了带其ID的用户列表后该怎么做。有没有比我上面做的更好的编码LINQ查询的方法?

LING查询应该能够基于首先发送到查询中的organizationalUnit ID返回任务列表。 在上述情况下,发送的organizationalUnit ID为1,应返回任务行1和2,因为jim和sally在OUID 1中。

解决方法

尝试以下条件:

var roleName = "HR";
var tasks = (from t in _context.Tasks
            join u in _context.Users on t.UserId equals u.Id
            join o in _context.OrganisationalUnits on u.OUID equals o.Id
            where o.Name == RoleName
            select t).ToList();

下面是测试:

public class OrganisationalUnit
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    [ForeignKey("OrganisationalUnit")]
    public int OUID { get; set; }
}

public class Task
{
    public int Id { get; set; }
    public string TaskInfo { get; set; }
    [ForeignKey("User")]
    public int UserId { get; set; }
}

enter image description here

enter image description here

enter image description here

结果:

enter image description here

,
public async Task<IEnumerable<TaskSchedule>> GetTasks(string RoleName)
{
   // Here you found the OU
   var OUObjReturned = await _context.OrganisationalUnits
    .Where(o => o.Name == RoleName)
    .FirstOrDefault();

   // Now get list of users id
   var userObjects = await _context.Users
    .Where(u => u.OUId == OUObjReturned.ID)
    .Select(u => u.ID)
    .ToListAsync();

   // Return Tasks
   return await _context.Tasks
    .Where(t => userObjects.Contains(t.UserID)
    .ToListAsync();

}

但是还有另一种方法:(假设FK配置正确)并且模型包括导航属性例如:用户必须包括对organisationalUnit的引用:

public class User
   {
      public int ID {get; set;}
      public string Name {get; set;}
      public OrganizationalUnit OU {get; set;}
      public int OUID {get; set;}
   }

现在您可以使用导航属性直接查询,请参见EF Net Core Relationships

public async Task<IEnumerable<TaskSchedule>> GetTasks(string RoleName)
{
   // Return Tasks
   return await _context.Tasks
    .Include(t => t.User)
    .Where(t => User.OU.Name == RoleName)
    .ToListAsync();
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...