【问题标题】:ef6 query many to many using bridgeef6 使用网桥查询多对多
【发布时间】:2019-02-05 21:41:19
【问题描述】:

如何查询这种多对多关系?我从 ACCOUNT 开始,并希望返回与其关联的 ExecutingBroker.Firm。

我从 Account 开始,然后我想钻到 MANAGER,然后到 MAPPING_MANAGER,然后到 EXECUTINGBROKER。

这是我目前的查询...

            var student = dbEF.Accounts        
                        .Where(x => x.AccountNumber == acctNum)
                        .Select(x => new DTOCrmDetails()
                        {
                            AccountNumber = x.AccountNumber,
                            AccountName = x.AccountName,
                            DateOpened = x.DateOpened,

                            CommissionId = x.CommissionId,
                            Commission = x.Commission,

                            ManagerID = x.ManagerID,
                            ManagerName = x.Manager.ManagerName,
                            Manager = x.Manager,

                            Employees = x.Manager.Employees,

                            WireInstructionsUSD = x.Manager.WireInstructionsUSDs

                        }).FirstOrDefault();  

以下是从现有数据库的 ef 生成的代码。

    public partial class Manager
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Manager()
    {
        this.Accounts = new HashSet<Account>();
        this.Employees = new HashSet<Employee>();
        this.WireInstructionsUSDs = new HashSet<WireInstructionsUSD>();
        this.Mapping_ManagersExecutingBrokers = new HashSet<Mapping_ManagersExecutingBrokers>();
    }

    public int ManagerID { get; set; }
    public string ManagerName { get; set; }
    public string Strategy { get; set; }
    public string ManagerShortCode { get; set; }
    public Nullable<int> WireInstructionsUsdID { get; set; }
    public Nullable<int> WireInstructionsForeignID { get; set; }
    public string MEtradingPlatform { get; set; }
    public string EtradingCostResp { get; set; }
    public string NotesManager { get; set; }
    public bool MainStrategy { get; set; }
    public string PathPayments { get; set; }
    public string PathEtrading { get; set; }
    public string LEI { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Account> Accounts { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Employee> Employees { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<WireInstructionsUSD> WireInstructionsUSDs { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Mapping_ManagersExecutingBrokers> Mapping_ManagersExecutingBrokers { get; set; }
}

}

{
using System;
using System.Collections.Generic;

public partial class Mapping_ManagersExecutingBrokers
{
    public int Mapping_ManagersExecutingBrokersId { get; set; }
    public Nullable<int> ManagerID { get; set; }
    public Nullable<int> ExecutingBrokersId { get; set; }

    public virtual ExecutingBroker ExecutingBroker { get; set; }
    public virtual Manager Manager { get; set; }
}

}

    public partial class ExecutingBroker
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public ExecutingBroker()
    {
        this.Mapping_ManagersExecutingBrokers = new HashSet<Mapping_ManagersExecutingBrokers>();
    }

    public int ExecutingBrokersId { get; set; }
    public string Firm { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Mapping_ManagersExecutingBrokers> Mapping_ManagersExecutingBrokers { get; set; }
}

【问题讨论】:

  • 您是否在相关实体上设置了导航属性?我在帐户中看到您有一个经理。 Manager 需要一个用于 Mapping,Mapping 需要一个用于 ExecutingBrokerFirm。然后你可以调用 Account.Manager.Mapping.ExecutingBrokerFirm。
  • 我添加了实体的代码...据我了解导航属性已经存在

标签: linq entity-framework-6


【解决方案1】:

您必须通过Mapping_ManagersExecutingBrokers,因为您已经以这种方式对其进行了建模。 请记住,您有一个公司集合,因为它是多对多关系。

.Select(account => new { Firms = account.Manager.Mapping_ManagersExecutingBrokers
                                .Select(meb => meb.ExecutingBroker.Firm) });

【讨论】:

  • 抱歉不明白。公司只是一个字符串。以及您编写的代码,我将如何将其合并到我的原始查询中?
  • 我将标签 [JsonIgnore] 添加到 MANAGER,它似乎有效。不知道为什么。看起来对吗?
  • @solarissf 不,Firms 不是字符串。您将(并且模型证实了这一点)描述为多对多关系。 IE。每个 Manager 可以有(属于?)几个 ExecutingBroker,一个 ExecutingBroker 可以有多个 Manager。您的 DTO DTOCrmDetails 需要有一个字符串集合(在我的示例中我将该属性命名为 Firms)。如果您只想在 DTO 中包含一个字符串 Firm,则必须加入它们:string.Join(', ', account.Manager.Mapping_ManagersExecutingBrokers.Select(meb =&gt; meb.ExecutingBroker.Firm)
猜你喜欢
  • 2017-01-19
  • 2014-02-12
  • 2013-11-26
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多