SelectMany / Select - 展平多对多关系

时间:2016-05-15 08:33:26

标签: c# entity-framework-6

我有一个名为Task的主表,每个Task可以连接到零个或多个Customers,所以我也有一个Customer_Task多对多表。基本上我想要的是将多对多关系展平以获得以下结果:

Task.Field1, ... ,Task.FieldN, Customer.Name, Customer.Number

所以基本上我只想要任务实体加上另外两个应该来自与Customer实体的多对多关系的字段。

我之前只成功使用了Select / SelectMany,这是一个非常简单的案例,所以我想我只是问专家。任何人都可以帮我这个吗?

我的猜测是这样的,但这不起作用:

var tasks = _database.Task.SelectMany(t=>t.Customer_Task.SelectMany(c=>c.Customer.Name)).ToList();

请求的类结构(我删除了很多不相关的信息):

public partial class Customer
{
    public Customer()
    {
        this.Customer_Task = new HashSet<Customer_Task>();
    }

    public int Id { get; set; }
    public string Number { get; set; }
    public string Name { get; set; }
}

public partial class Customer_Task
{
    public int CustomerId { get; set; }
    public int TaskId { get; set; }

    public virtual Customer Customer { get; set; }
    public virtual Task Task { get; set; }
}

public partial class Task
{
    public Task()
    {
        this.Customer_Task = new HashSet<Customer_Task>();
    }

    public int Id { get; set; }
    public int Number { get; set; }
    public string Header { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Customer_Task> Customer_Task { get; set; }
}

我得到的异常是ArgumentException:

System.ArgumentException was unhandled
Message=DbExpressionBinding requires an input expression with a collection ResultType.

1 个答案:

答案 0 :(得分:1)

如果我了解您的要求,那么应该这样做:

var _database = new List<Task>
            {
                new Task
                {
                    Customer_Task = new List<Customer_Task>
                    {
                        new Customer_Task
                        {
                            Customer = new Customer {Id = 1, Name = "a"},
                            Task = new Task {Id = 1, Number = 1}
                        },
                        new Customer_Task
                        {
                            Customer = new Customer {Id = 1, Name = "b"},
                            Task = new Task {Id = 1, Number = 1}
                        },
                        new Customer_Task
                        {
                            Customer = new Customer {Id = 2, Name = "a"},
                            Task = new Task {Id = 2, Number = 2}
                        },
                        new Customer_Task
                        {
                            Customer = new Customer {Id = 2, Name = "b"},
                            Task = new Task {Id = 2, Number = 2}
                        }
                    },
                }
            };
            var tasks = _database.SelectMany(t => t.Customer_Task.Select(c => new { Task = c.Task.Id, Name =c.Customer.Name})).ToList();
            foreach (var t in tasks)
            {
                Console.WriteLine(t.Task + " "+t.Name);
            }
            Console.ReadLine();

结果如下:

1 a 1 b 2 a 2 b

因此您可以从

更改查询
var tasks = _database.Task.SelectMany(t=>t.Customer_Task.SelectMany(c=>c.Customer.Name)).ToList();

var tasks = _database.Task.SelectMany(t=>t.Customer_Task.Select(c=>c.Customer.Name)).ToList();