我希望能够过滤子集合,只返回该子集合中符合特定条件的项目。这是我现在的代码:
var q = from u in context.DbContext.Users select u;
q = q.Include(u => u.UserRoles.Select(ur => ur.Role))
.Where(u=> u.UserRoles.Any(ur=> ur.EnvironmentId == environmentId)
);
我对此代码的问题是,这也是在UserRole集合中返回不匹配的UserRole对象。
例如,如果我的environmentId
变量的值为1,则只希望UserRoles在集合中返回,如果它们对EnvironmentId属性的值为1。
截至目前,无论EnvironmentId值如何,它都会返回每个UserRole。
这不是格特阿诺德建议的重复问题。我不想创建新的或匿名的对象,我在下面提出的解决方案解决了这个问题,而由Gert Arnold链接的文章却没有。
答案 0 :(得分:0)
您的angular.module('kanban')
.component('boardComponent', {
templateUrl: 'app/components/board/board.html',
controller: BoardController,
controllerAs: 'bc'
})
BoardController.$inject = ['EsService']
function BoardController(EsService) {
var bc = this;
bc.lists = EsService.getLists();
bc.addingList = false;
bc.removeList = function(list){
EsService.removeList(list.id);
}
bc.addList = function(list){
EsService.createList(list);
bc.newList = {};
}
bc.toLists = function() {
bc.cover = angular.element(document.getElementsByClassName('cover'));
bc.content = angular.element(document.getElementsByClassName('content'));
bc.cover.scrollTo(bc.content, 0, 1000);
}
}
条件未应用于正确的集合。在这里,您将Where
应用于User集合,以便它只返回至少具有Where
为1的角色的用户。您想要做的是将其应用于您的Role集合只加入你想要的人。 这不起作用 我相信这样的事情应该有效:
EnvironmentId
你可以做的是通过选择返回一个新对象(我现在进入不确定的领域:)
q = q.Include(
u => u.UserRoles.Where(ur => ur.EnvironmentId == environmentId)
.Select(ur => ur.Role))
现在出现了奇怪的部分......这将返回一个匿名对象,其中User properties是您的返回用户,而Roles,您返回的角色。如果您希望创建一个新类,以便可以在该块的范围之外传递该值。
新班级
q = q.Select(u =>
new {
User = u,
Roles = u.UserRoles.Where(ur => ur.EnvironmentId == environmentId)
};
查询
public class UserWithRoles
{
Public User User {get; set;}
IEnumarable<Roles> Roles {get; set;}
}
通过这种方式你可以声明一个q => q.Select(u =>
new UserWithRoles() {
User = u,
Roles = u.UserRoles.Where(ur => ur.EnvironmentId == environmentId)
};
而你可以做List<UserWithRoles> UserList
这可能不是(可能不是)最好的方法,但这是我相信它会起作用的一种方式。如果在LINQ的UserList = q.ToList();
知道如何使我的知识更好,并且知道如何使这项工作更好,请发表另一个答案或评论这个,我也想知道:)
答案 1 :(得分:0)
您可能会考虑只返回一个用户列表,如果需要用户对象,可以从此列表中选择用户
var roles = from ur in context.DbContext.UsersRoles.Include("User")
where ur.EnvironmentId == environmentId
select ur;
var users = roles.SelectMany(a => a.Users).Distinct();
答案 2 :(得分:0)
使用此处提供的示例Filtering Related Entity Collections我想出了一个似乎是一个清晰而优雅的问题解决方案。这只会加载集合中的项目(如果它们匹配),并且不需要创建任何匿名对象。 (注意:必须关闭LazyLoading才能显式加载)
User user;
var data = from u in context.DbContext.Users select u;
user = data.FirstOrDefault();
// load UserRoles and UserRoles.Role
context.Entry(user)
.Collection(u => u.UserRoles)
.Query()
.Include(ur => ur.Role)
.Where(ur => ur.EnvironmentId == environmentId)
.Load()
;