【问题标题】:Get a list of elements by their ID in entity framework通过实体框架中的 ID 获取元素列表
【发布时间】:2011-08-03 05:38:59
【问题描述】:

如何按 ID 获取另一个列表中的所有元素? 我有列表角色;我想通过他们的 ID 从数据库中获取此列表中的所有角色。

我使用的是代码优先。

我这样做了,但它抛出了一个错误:

var roles = db.Roles.Where(r => user.Roles.Any(ur => ur.RoleId == r.RoleId));

RoleId 是 int 类型。

错误:

无法创建“SampleMVC.Domain.Role”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。

【问题讨论】:

    标签: c# .net ef-code-first entity-framework-4.1


    【解决方案1】:
    var listOfRoleId = user.Roles.Select(r => r.RoleId);
    var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId));
    

    【讨论】:

    • 应该是,检查生成的SQL,或者在LinqPad中试试
    • 如果user 被加载实体并且如果它已经加载Roles 它将是一个查询。
    • 这适用于小型数据集,但如果 ID 列表很大,您将需要另一种方式。 stackoverflow.com/questions/1869753/…
    • 这也可以与连接一起使用吗?我试过同样的事情,它给了我这个错误:无法比较类型为'System.Collections.Generic.List`1[[System.Int32,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=的元素b77a5c561934e089]]'。仅支持原始类型、枚举类型和实体类型。
    • @AmitAndharia 你解决了那个问题吗?使用连接时出现同样的错误。
    【解决方案2】:

    如果 user.Roles 是一个整数列表,这样的事情应该可以工作:

    var roles = db.Roles.Where(r => user.Roles.Contains(r.RoleId));
    

    这会将它变成 SQL 中的“SELECT WHERE IN (x, y, z...)”。

    【讨论】:

    • 我不能使用 r.RoleId 因为 Roles 是一个类而 RoleId 是一个 int。
    • 想法不错!您可以在...user.Roles.......Contains... 之间插入.Select(ur => ur.RoleId).。我很好奇查询是否有效。
    • 像魅力一样工作:)
    【解决方案3】:

    您不能将本地列表与远程数据结合起来,那么数据库就没有什么可以读取的了,因为数据是 elsewere(在您的客户端上)。

    我认为您正在尝试做的事情可能有更好的解决方案;

    您似乎正在尝试获取分配给特定用户的所有角色。如果是这种情况,我建议您将当前用户 ID 传递给数据库并获取分配有 INNER JOIN 的角色的解决方案。

    根据您的数据库,它可能看起来像这样(如果您通过名为“UserRoles”的表将用户与角色连接起来)

    var roles = db.UserRoles.Where(x => x.UserID == <insert id>).Select(x => x.Role)
    

    (当然,如果您喜欢直接在数据库中创建一个返回“角色”列表的存储过程并对其进行映射。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多