【问题标题】:Outerjoin with a table of foreign keys in EF Data-first approach在 EF 数据优先方法中使用外键表进行外连接
【发布时间】:2018-04-09 04:40:01
【问题描述】:

我有一个包含用户信息的用户表。我有一个包含产品信息的产品表。我有一个名为 UserProduct 的表,它充当联结表,其字段是 UserId 和 ProductId。我正在使用实体框架数据库第一方法。

我想使用 Linq 进行外连接以查找以下数据。

  1. 用户表中的所有用户。

  2. 所有购买了特定产品的用户,都使用名为 isPurchased 的布尔值。

我的想法是用 UserProduct 离开外部连接表 User 并获取所有用户以及他们是否有类似这样的产品。

var result = from a in Users 
         join b in UserProduct(Not available through EF) on a.Id equals b.prodId into group1
         from g1 in group1.DefaultIfEmpty()
         select new 
         {
              id =  g1.Id,                  
              isPurchased = g1.prodId != null
         }.ToList();

但是在 EF 映射中,没有创建对象 UserProduct,所以我不能直接在我的 Linq 查询中使用它?那么我该怎么做呢?有没有办法可以使用 linq 将表与实际表名 (UserProduct) 连接起来,而不是连接实体?

【问题讨论】:

  • 我认为我们可能需要有关您的模型和表格名称的更多信息。例如,我猜UserProduct 是一个类型,而不是一个集合,这可能就是你的加入没有意义的原因。
  • 如果你先做数据库,你需要去你的 edmx 文件。 (听起来像你)。确保 UserProduct 的对象在那里存在。如果它继续移动,如果不是右键单击设计表面并从数据库中添加它。如果它存在并且没有显示它应该在您的 *.tt 文件下的 edmx 文件下,只需通过右键单击正确的 tt 文件选择“运行自定义工具”,它应该会为您生成 POCO。
  • @djangojazz edmx 中没有 UserProduct 的对象,因为它是一个只有外键的表,所以不会有它的对象。
  • ???你在问你是如何得到一些东西的,然后你就不需要它了。据我所知,您无法从实体框架中获得不存在的东西作为生成的 POCO。这就是实体框架的工作方式,这些就是实体。它们通常以 DbSet 的形式存在,然后是生成的 POCO,其属性与生成它的表相关。
  • 如果你有一个联结表,你应该在代表联结表信息的UsersProducts对象中有List属性——你能发布你对Users和@的定义吗987654327@?您的示例代码也没有针对特定产品进行测试?

标签: c# entity-framework linq


【解决方案1】:

假设Users 包含一个属性List<Products> products 来表示连接信息,以及一个变量boughtProductId 来表示特定产品:

var result = from u in Users
             let isPurchased = u.products.Any(p => p.Id == boughtProductId)
             select new {
                 id =  isPurchased ? boughtProductId : null,
                 isPurchased
             }.ToList();

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2011-12-12
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2019-08-26
    • 2019-06-05
    • 2014-03-28
    相关资源
    最近更新 更多