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 <AnonymousType#1>'转换为'System.Linq.IQueryable <AnonymousType#2>'
错误2'System.Collections.Generic.List <AnonymousType#1>'不包含'Union'的定义和最佳扩展方法重载'System.Linq.Queryable.Union <TSource>(System.Linq.IQueryable <TSource >,System.Collections.Generic.IEnumerable <TSource>)'有一些无效参数

第三个序列唯一的区别是,我正在使用另一个表进行连接。 我尝试过.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

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


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

作为一个方面说明,你可能也想改变你的代码的这一行:

transactions.Union(cases);

对此:

var unionedQuery = transactions.Union(cases);

否则它不会执行联合,因为您尚未存储结果查询。

链接地址: http://www.djcxy.com/p/75245.html

上一篇: LINQ to Entities Union is throwing an error

下一篇: WPF DataGrid DataBinding is not displayed