我在两个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.DateModified
和e.DateModified
,则不会发生错误。
答案 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
扩展方法将存在,因为您正在联合的两个序列属于同一类型。