如何解决LINQ查询以从由三个表连接的表中获取数据
我有三个桌子。
- organizationalUnit
- 用户
- 任务
我想从任务表中返回数据,其中授权用户在特定部门中,而用户也在该部门中。 例如,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; }
}
结果:
,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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。