过滤实体集合

时间:2016-08-10 16:00:45

标签: c# linq

我希望能够过滤子集合,只返回该子集合中符合特定条件的项目。这是我现在的代码:

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链接的文章却没有。

3 个答案:

答案 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()
;