【问题标题】:Many to Many Query with Generic Repostitory使用通用存储库进行多对多查询
【发布时间】:2015-04-09 14:28:08
【问题描述】:

有人能指出我查询多对多关系的正确方向吗?我正在尝试获取所有活跃机器操作员的列表,但我这辈子似乎无法做到这一点。

如果它有任何用处,这就是我一直在尝试的方法

public HttpResponseMessage Get()
    {
        using (DAL.Repositories.Repository<Machine> machineRepo = new DAL.Repositories.Repository<Machine>())
        using (DAL.Repositories.Repository<Operator> operatorRepo = new DAL.Repositories.Repository<Operator>())
        {
            List<int> OperatorIDs = new List<int>();
            List<Machine> Machine = new List<Machine>();

            OperatorIDs = operatorRepo.FindAll(x => x.Active).Select(y => y.ID).ToList();

            var machineOperators = machineRepo.FindAll(x => x.Active).Select(x => x.Operators.All(o => OperatorIDs.Contains(o.ID)));


            return Request.CreateResponse(HttpStatusCode.OK, machineOperators);
        }
    }

我的代码如下

public class Operator
{
    public Operator()
    {
        Machines = new HashSet<Machine>();
    }

    public int ID { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public bool Active { get; set; }

    // Navigational Link
    public virtual ICollection<Machine> Machines { get; set; }
}

public class Machine
{
    public Machine()
    {
        Departments = new HashSet<Department>();
        Operators = new HashSet<Operator>();
    }

    public int ID { get; set; }
    public string MachineName { get; set; }
    public bool Active { get; set; }

    public ICollection<Operator> Operators { get; set; }
}

在我的 efContext 中

public MachineConfiguration()
    {
        // Key
        HasKey(x => x.ID);

        // Fields
        Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        Property(x => x.MachineName).IsRequired();

        // Table
        ToTable("Machine");

        // Relationships
        HasMany(e => e.Operators)
            .WithMany(e => e.Machines)
            .Map(m => m.ToTable("MachineOperators")
                .MapLeftKey("MachineID")
                .MapRightKey("OperatorID"));
    }

【问题讨论】:

  • 您要返回什么?所有操作员都处于活动状态的所有活动机器?
  • 活动机器列表及其对应的活动操作员

标签: c# entity-framework asp.net-web-api many-to-many


【解决方案1】:

试试这个:

public HttpResponseMessage Get()
{
    using (DAL.Repositories.Repository<Machine> machineRepo = new DAL.Repositories.Repository<Machine>())
    {
        var machineOperators = machineRepo.FindAll(x => x.Active).Include(x=>x.Operators).Where(x => x.Operators.All(o =>o.Active)).ToList();

        return Request.CreateResponse(HttpStatusCode.OK, machineOperators);
    }
}

【讨论】:

  • 返回活动机器,但没有操作员{ "$id": "1", "ID": 1, "MachineName": "Roland X1000", "Active": true, "Operators": [], "Departments": [] }
  • 也许你禁用了延迟加载,尝试使用 Include 扩展方法预先加载导航属性。
  • 现在我看到您的Operator 导航属性不是virtual,如果您希望EF 跟踪您的实体中的更改并延迟加载您的导航属性,您需要将它们声明为虚拟:@ 987654329@
  • 是的,效果很好。现在我在返回结果时遇到了这个错误。 The 'ObjectContent1' type failed to serialize the response body for content type 'application/json; charset=utf-8
  • 查看以下帖子中的答案:post1post2post3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多