(полное воспроизведение см. Внизу))
Со следующей сущностью ...
[Table]
internal sealed class Employee
{
private EntityRef<Employee> manager;
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
private int Id;
[Column]
private int? ManagerId;
[Column]
internal bool IsOverpaid;
[Association(Name = "Manager_Subordinate", Storage = "manager", ThisKey = "ManagerId", IsForeignKey = true)]
internal Employee Manager
{
get { return this.manager.Entity; }
set { this.manager.Entity = value; }
}
}
... этот запрос завершается ошибкой NotSupportedException с сообщением " Типы в Union или Concat построены несовместимо. ":
var overpaidTopManagers =
from employee in context.Employees
where employee.IsOverpaid && (employee.Manager == null)
select employee;
var managersWithOverpaidSubordinates =
from employee in context.Employees
where employee.IsOverpaid && (employee.Manager != null)
select employee.Manager;
var query = overpaidTopManagers.Union(managersWithOverpaidSubordinates);
Я действительно не понимаю, почему оба запроса производят один и тот же тип объекта, поэтому объединить их не должно быть проблемой?
Полное воспроизведение следует:
using System;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Linq;
internal static class Program
{
private static void Main(string[] args)
{
using (var context = new Context("Whatever.sdf"))
{
if (!context.DatabaseExists())
{
context.CreateDatabase();
}
var overpaidTopManagers =
from employee in context.Employees
where employee.IsOverpaid && (employee.Manager == null)
select employee;
var managersWithOverpaidSubordinates =
from employee in context.Employees
where employee.IsOverpaid && (employee.Manager != null)
select employee.Manager;
var query = overpaidTopManagers.Union(managersWithOverpaidSubordinates);
// This throws a NotSupportedException with the Message
// "Types in Union or Concat are constructed incompatibly."
foreach (var manager in query)
{
Console.WriteLine(manager.ToString());
}
}
}
}
[Table]
internal sealed class Employee
{
private EntityRef<Employee> manager;
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
private int Id;
[Column]
private int? ManagerId;
[Column]
internal bool IsOverpaid;
[Association(Name = "Manager_Subordinate", Storage = "manager", ThisKey = "ManagerId", IsForeignKey = true)]
internal Employee Manager
{
get { return this.manager.Entity; }
set { this.manager.Entity = value; }
}
}
internal sealed class Context : DataContext
{
internal Table<Employee> Employees;
internal Context(string fileOrServerOrConnection) : base(fileOrServerOrConnection)
{
this.Employees = this.GetTable<Employee>();
}
}