繁体   English   中英

EF综合查询联接

[英]EF Complex Query Join

下面显示的查询非常简单,它将简单地为指定客户拉出任务。 我现在想做的是获取传递给此函数的UserId并验证用户是否有权查看该任务。

            var dbData = await db.Tasks
                .Where(a => a.CustomerId == customerId)
                .OrderBy(a => a.CreatedDateTime).ToListAsync();

在Tasks表中有一个OrganizationId属性。 用户可以通过UserOrganizations表属于n + 1个组织。 获取已知UserId并验证Task.OrganizationId是用户之一的最佳方法是什么?

如果关系不是Tasks类的属性,则可以用查询语法编写联接。 遵循以下原则:

var dbData = await (from t in db.Tasks
                    join uo in UserOrganizations on t.OrganizationId equals uo.OrganizationId
                    join u in Users on uo.UserId equals u.UserId
                    where t.CustomerId == customerId && u.UserId == theUserId
                    order by t.CreatedDateTime
                    select t).ToListAsync();

根据生成数据类的方式,您可能已经在Tasks类上具有导航属性,从而可以执行以下操作:

var dbData = await db.Tasks
            .Where(a => a.CustomerId == customerId && a.Organization.UserOrganizations.Any(uo => uo.UserId == theUserId)
            .OrderBy(a => a.CreatedDateTime).ToListAsync();
var dbData = await db.Tasks
                .Where(a => a.CustomerId == customerId
                         && a.Organization.Users
                                        .Any(u=>u.UserId == customerId)))
                .OrderBy(a => a.CreatedDateTime).ToListAsync();

假定已设置外键,并且可以在实体之间导航关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM