协助Linq查询

时间:2015-12-16 14:48:12

标签: c# entity-framework linq

我是LINQ的新手,需要一些查询帮助。

我需要(tblResources)中属于 匿名 的所有资源,以及 Public ResourceGroups (tblResourceGroups)。此外,我还需要属于 currentUser 所属的 ResourceGroups 的所有资源

如果 currentUser 未登录(currentUser == null),则只有属于 匿名的资源 ,并且应返回 公开 资源组

注意:我的数据模型不包含tblResourceAccess的实体。我不确定为什么在创建模型时没有添加这个实体。

        string currentUser = IdentityHelper.GetUserIdFromRequest(Context.Request);

        var result = from r in DbContext.Resources                                                                           
                     where r.Active == true // && r.ResourceGroups?????                         
                     select new
                     {                                                          
                         ResourceTypeName = r.ResourceType.Name,
                         Name = r.Name,
                         Version = r.Version,
                         Description = r.Description,
                         Path = r.Path,
                         Active = r.Active
                     };

Entity Data Models

Database Tables

2 个答案:

答案 0 :(得分:0)

tblResourceAccess被EF抽象出去,ResourceGroups属性被添加到Resource表中以提供功能。使用这种关系,我们可以将以下查询拼凑在一起:

from r in DBContext.Resources.ToList()
where (currentUser == null 
        && ("anonymous,public").Contains(
            r.ResourceGroups.Name.ToLower()))
    || (currentUser != null)
select new
    {                                                          
        ResourceTypeName = r.ResourceType.Name,
        Name = r.Name,
        Version = r.Version,
        Description = r.Description,
        Path = r.Path,
        Active = r.Active
    };

答案 1 :(得分:0)

最后,经过很多的试用和错误!我不确定这是否是实现此查询的最佳方式,但它确实有效。

感谢您的帮助 @The Sharp Ninja

string currentUser = IdentityExtensions.GetUserId(HttpContext.Current.User.Identity);

var resources = from r in DbContext.Resources                            
                where r.ResourceGroups.Any(
                      rg => rg.Name == "Anonymous" || 
                      rg.Name == "Public" || 
                      rg.ResourceUserGroups.Any(ug => ug.UserID == currentUser))
                select r;