我有一个名为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.
答案 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();