我已成功完成以下工作:
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()
,但没有人帮助过。
答案 0 :(得分:8)
当你创建interactions
时,它的类型不是int和DateTime的匿名类型,它是int和 nullable 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的值。
答案 1 :(得分:0)
很可能t1.Key和i1.Key是不同的类型。匿名类型必须具有完全相同的属性名称和类型,以相同的顺序声明,以便能够将它们合并。
作为旁注,您可能还想更改代码的这一行:
transactions.Union(cases);
到此:
var unionedQuery = transactions.Union(cases);
否则它将不会执行联合,因为您尚未存储生成的查询。