【问题标题】:Proper LINQ Expression正确的 LINQ 表达式
【发布时间】:2018-02-14 00:30:09
【问题描述】:

我一直在尝试搜索 Google,但无济于事。感觉好像以前有人问过,但也许我没有在谷歌上搜索我认为我需要的正确内容。

我想获取Object 的集合,其中ICollection<T>Id 属性是value

我应该用哪种方式编写这个 Linq 表达式?

例如:

public class User {
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Role> Roles { get; set; }
}

public class UserRole {
    public int UserId { get; set; }
    public int RoleId { get; set; }
}

如果我知道RoleId,我如何获得所有User?以下似乎是正确的,它确实给了我我需要的东西:

示例 1

var roleId = 1;
var users = db.UserRoles.SingleOrDefault(r => r.RoleId == roleId).Roles;

但是,是否有可能反过来得到相同的结果?例如,我试过这个:

示例 2

var roleId = 1;
var users = db.Users.Where(u => u.UserRoles.Where(r => r.RoleId == roleId)).Users;

我收到一条消息说Cannot convert type UserRole to bool

  • 还有其他方法可以获得Users吗?
  • 知道我想要Object-X,但只知道Navigation 属性的值,我应该如何考虑编写表达式?
    • 我是否应该想:“获取Object-Y where It's Id is this, then give me Object-X
    • 还是别的什么?

我问是因为我习惯于这样思考:“Get `Object-X where it's Object-Y has this value”。

也许我把这弄糊涂了,但我希望有人能帮助解决它。

【问题讨论】:

    标签: c# linq lambda linq-expressions


    【解决方案1】:

    如果我知道 RoleId,我如何获取所有 User 的?

    假设 Role 类具有 RoleId 属性,您可以执行以下操作:

    var roleId = 1;
    var users = db.Users.Where(q => q.Roles.Any(w => w.RoleId == roleId));
    

    【讨论】:

    • 啊!这就是我所缺少的!我需要记住Any()
    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2019-09-18
    • 2021-05-22
    相关资源
    最近更新 更多