如果查询中的列是DateTime,则LINQ Union导致错误

本文关键字:LINQ Union 错误 DateTime 查询 如果 | 更新日期: 2023-09-27 18:04:15

我在两个LINQ查询的UNION中得到以下错误:

'IQueryable<<anonymous type: string CustName, DateTime? ModifiedDate>>' does not contain a definition for 'Union'......

:

Public class Customer
{
   public string CustName{ get; set; }
   public DateTime? DateModified{ get; set; }
}
Public class Employee
{
   public string EmplName{ get; set; }
   public DateTime? DateModified{ get; set; }
}

联合查询:

var Query1 = (from c in Customers
               select new {c.CustName, c.DateModified}).Union((from e in Employees
               select new {e.EmplName, e.DateModified}));

NOIE:如果我从查询中删除c.DateModifiede.DateModified,错误不会发生

如果查询中的列是DateTime,则LINQ Union导致错误

您已经更改了第二个匿名类型中的属性名称,因此编译器将在查询中构造两个不同的类型。在这两种情况下,您必须为客户/员工名称选择一个名称,例如:

var Query1 = (from c in Customers
               select new {Name = c.CustName, c.DateModified}).Union((from e in Employees
               select new {Name = e.EmplName, e.DateModified}));

通常,建议避免让编译器在匿名类型中显示属性名。这就是导致错误的原因,例如,当您稍后重构并更改某些属性的名称时,如EmplName。该更改会自动影响使用EmplName为属性赋值的匿名类型。因此,最好对属性名绝对明确,如:

var Query1 = (from c in Customers
               select new {Name = c.CustName, Date = c.DateModified})
    .Union((from e in Employees
               select new {Name = e.EmplName, Date = e.DateModified}));

这样做时,编译器将为上面使用的两个匿名类型构造一个类型。该类型将具有属性Name和Date(按照特定的顺序—即使更改了名称的顺序也会生成新类型)。然后Union扩展方法就出现了因为你要合并的两个序列是同一类型的