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

时间:2016-08-27 23:36:59

标签: c# linq visual-studio-2015

我在两个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; }
}

UNION查询:

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,则不会发生错误。

1 个答案:

答案 0 :(得分:3)

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

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扩展方法将存在,因为您正在联合的两个序列属于同一类型。