【发布时间】:2018-03-06 23:56:31
【问题描述】:
我有一个应用程序、AppRoles、UserAppRoles 和用户。我正在尝试获取所有用户,但只想要 AppId = 1 的 AppRoles。如何过滤子集合?
using (var context = new dbContext())
{
var rv = context.Users
.Include(u => u.AppRoles);
}
我试过这个但是抛出异常: 包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符
public static async Task<List<User>> GetAllAsync()
{
var rv = new List<User>();
using (var context = new dbContext())
{
rv = await (context.Users.AsNoTracking()
.Include(a => a.AppRoles.Where(a2 => a2.AppId == 1)).ToListAsync());
}
return rv;
}
我能弄清楚如何让它工作的唯一方法就是这样,我还不如在这一点上使用存储过程:
var rv = new List<User>();
using (var context = new dbContext())
{
rv = context.Users.AsNoTracking()
.Include(a => a.AppRoles).ToList();
}
foreach (var user in rv)
{
if (user.AppRoles.Any())
{
user.AppRoles = user.AppRoles.Where(r2 => r2.AppId == 1).ToList();
}
}
如何在 EF 中编写这个?
SELECT
Users.UserId,
Users.UserName
FROM
Users
INNER JOIN UserAppRoles ON Users.UserId = UserAppRoles.UserId
INNER JOIN AppRoles ON UserAppRoles.AppRoleId = AppRoles.AppRoleId
WHERE AppRoles.AppId = 1
【问题讨论】:
-
可能是Linq join。
-
您能否提供使用上述代码的 sn-p 代码,我仍然无法使其正常工作。谢谢
-
你们的关系是如何建立的?如果您可以在 SQL 中编写连接,那么 Linq 查询将非常相似。 lambda 风格只是受虐狂。
-
我有 Apps、AppRoles、UserAppRoles 和 Users 表,UserAppRoles 加入了 AppRoles 和 Users 表(UserId 和 AppRoleId 都是 pk),AppsRoles 是 Apps 的子级,1:m 到 UserAppRoles。
-
上面的sql我加了
标签: entity-framework entity-framework-6