LINQ to Entities Union正在抛出错误

我成功完成了以下工作:

var transactions = from t in context.Transactions group t.Create_Date_Time by t.Participation_Id into t1 select new { ParticipationId = t1.Key, CreateDateTime = t1.Max() }; var cases = from c in context.Cases group c.Create_Date_Time by c.Participation_Id into c1 select new { ParticipationId = c1.Key, CreateDateTime = c1.Max() }; var interactions = from i in context.Interactions join pp in context.Party_Participation on i.Party_Id equals pp.Party_Id group i.Last_Update_Date_Time.HasValue ? i.Last_Update_Date_Time : i.Create_Date_Time by pp.Participation_Id into i1 select new { ParticipationId = i1.Key, CreateDateTime = i1.Max() }; transactions.Union(cases); 

但是当我试图添加第三个输出时,

 transactions.Union(interactions); // or interactions.Union(transactions); 

我收到以下错误

无论哪种方式,它都抛出以下错误

错误1实例参数:无法从’System.Collections.Generic.List ‘转换为’System.Linq.IQueryable ‘
错误2’System.Collections.Generic.List ‘不包含’Union’的定义和最佳扩展方法重载’System.Linq.Queryable.Union (System.Linq.IQueryable ,System.Collections.Generic.IEnumerable )’有一些无效的参数

第三个序列的唯一区别是,我正在使用另一个表连接。 我试过.AsEnumerable() .ToList().ToArray() ,但没有一个帮助过。

当您创建interactions ,其类型不是int和DateTime的匿名类型,它是int和可为空的 DateTime。 这是因为在你的内联if语句中,你永远不会从可空列调用.Value 。 如果您创建这样的interactions您的代码应该有效:

 var interactions = from i in context.Interactions join pp in context.Party_Participation on i.Party_Id equals pp.Party_Id group i.Last_Update_Date_Time.HasValue ? i.Last_Update_Date_Time.Value : i.Create_Date_Time by pp.Participation_Id into i1 select new {ParticipationId = i1.Key, CreateDateTime = i1.Max()}; 

更简单的例子:

 var lst = new int?[] { 2,3,null,5,5 }; var lst2 = new int[] { 2,3,4,5,6 }; lst.Select(x => x.HasValue ? x.Value : 0).Union(lst2); //works fine lst.Select(x => x.HasValue ? x : 0).Union(lst2); //throws error lst.Select(x => x ?? 0).Union(lst2); //also works 

尽管我们可以很容易地看到内联if语句在任何一种情况下都不会返回空值,但编译器无法做出这样的保证,并且必须在第二种情况下键入返回值为可空int的返回值。

很可能t1.Key和i1.Key是不同的类型。 匿名类型必须具有完全相同的属性名称和类型,以相同的顺序声明,以便您能够将它们联合起来。

作为旁注,您可能还想更改代码的这一行:

 transactions.Union(cases); 

对此:

 var unionedQuery = transactions.Union(cases); 

否则它将不会执行联合,因为您没有存储生成的查询。