【问题标题】:Entity Framework/LINQ: Selecting columns from multiple tables?实体框架/LINQ:从多个表中选择列?
【发布时间】:2013-01-25 04:26:52
【问题描述】:

型号:

 public class User
 {
     [Key]
     public int UserId { get; set; }
     public string UserName { get; set; }
 }

public class Resource
{
    [Key]
    public int ResourceId { get; set; }
    public string ResourceName { get; set; }
    public string  ResourceDescription { get; set; }
}

public class UserResource
{
    [Key, Column(Order=0)]
    public int UserId { get; set; }
    [Key, Column(Order=1)]
    public int ResourceId { get; set; }
    public int ResourceQuantity { get; set; }
}

对于给定的“UserId”,我想从 Resource 模型中选择“ResourceName”,从 UserResource 模型中选择“ResourceQuantity”。 另外,一旦被选中,我是否需要一个全新的模型来只承载这两个指定的列?

还请注意,UserResource 模型有一个复合键,所以我对如何进行连接感到困惑......这是对的吗?

 var userResources =
          from r in imDB.Resources
          join ur in imDB.UserResources
          on r.ResourceId equals ur.ResourceId
          select new { r.ResourceName, ur.ResourceQuantity };

【问题讨论】:

  • 你能解释一下你的业务场景吗?如果您需要在必须具有 M:M 关系时使用复合键(作为连接模型)。您的其他具有多种关系的模型是什么?
  • 嗨,我的另一个模型是一个非常简单的模型,叫做 User。 UserResource 模型加入了 User 和 Resource 模型。我更新了模型。
  • 你是先有代码还是什么?您使用的是哪个 EF 版本?
  • 是 Code First,最新的 EF (5)

标签: linq entity-framework ef-code-first many-to-many entity-framework-5


【解决方案1】:

因此您使用Code first,您可以使用EF conventions. 创建如下模型

public class User {
    public int Id { get; set; }
    public string UserName { get; set; }

    public virtual ICollection<Resource> Resources { get; set; }
   }

public class Resource {
    public int Id { get; set; }
    public string ResourceName { get; set; }
    public int ResourceQuantity { get; set; }

    public virtual ICollection<User> Users {get;set;}
}

然后 EF 将生成您的 junction tableUsersResources.您不需要像以前那样创建额外的模型。EF 会处理这些。

在使用带有 EF 的 POCO 时,如果您将导航属性标记为 virtual 你可以使用额外的 EF 支持,比如延迟加载。所以在 一般在考虑的导航属性中使用虚拟关键字 做个好习惯。

更新

您可以尝试以下方法:

方法一:基于方法的语法

imDB.Resources.Where(r => r.Users.Any(u => u.UserId == userId))

方法二:基于查询的语法

from r in imDB.Resources
from u in r.Users
where u.UserId == userId
select r;

希望对你有帮助。

【讨论】:

  • 哇,谢谢,这是否意味着我可以摆脱 UserResources 模型?虽然我注意到的一件事是您将“ResourceQuantity”放入资源模型中,但每个用户都应该拥有自己的任何资源数量的副本。
  • @Deniz 你能解释一下“user”和“ResourceQuantity”之间的关系吗?是 1:M 还是 M:M ?
  • 一个用户可以拥有许多不同的资源(通过不同的resourceId)。用户可以拥有不同数量的每种不同类型的资源(由 ResourceQuantity 列指示)。
  • @Deniz 是的。我觉得我是对的。所以你可以摆脱“UserResource”模型。试试这个,如果你有任何问题,请告诉我?
  • 非常感谢您到目前为止 Sampath 的帮助,我真的很感激人们在这个网站上如此乐于助人。我正在尝试编写代码以返回给定用户的 Resource 对象,但我收到了 UserId 位的波浪形错误。 return imDB.Resources.Where(r => r.Users.UserId == userId);
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2018-02-03
  • 2011-08-23
相关资源
最近更新 更多