如何更好地组合从一个interfase继承的不同类型的通用列表?

时间:2017-08-24 10:51:37

标签: c# linq generics inheritance union

我有界面:

public interface IBase
{
Guid Id { get; set; }
string ObjectName { get; set; }
string Val { get; set; }
}

以及实现此接口的几个类

public class A : IBase
{
Guid Id { get; set; }
string ObjectName { get; set; }
string Val { get; set; }
}

public class B:IBase
{
Guid Id { get; set; }
string ObjectName { get; set; }
string Val { get; set; }
}

我也有DTO课程

public class CdcDto
{
 public List<A> A { get; set; }
 public List<B> B { get; set; }
 public List<IBase> UnionAB => A.Union(B).ToList();
}

DTO我收到错误:

  

List<A>不包含“UNION”的定义和最佳定义   扩展方法重载IQueryable.Union<B>(IQueryable<B>, IEnumerable<B>)需要类型为IQueryable<B>的接收器

一个澄清。联合的类别不止两个。如何更好地结合这些类?我不想比较这些课程。我只想在union all中使用SQL

3 个答案:

答案 0 :(得分:3)

试试这个:

public List<IBase> UnionAB => A.Union<IBase>(B).ToList();

答案 1 :(得分:3)

错误消息告诉您Union

  

需要'IQueryable&lt;类型'的接收器B&gt;'

因此您需要将A转换为Ibase类型:

public List<IBase> UnionAB => A.Cast<IBase>().Union(B).ToList();

或B:

public List<IBase> UnionAB => A.Union(B.Cast<IBase>()).ToList();

或者第三种方法是将通用类型参数指定为IBase,它将指定结果类型并匹配您的属性:public List<IBase> UnionAB

public List<IBase> UnionAB => A.Union<IBase>(B).ToList();

答案 2 :(得分:2)

你可以尝试:

public List<IBase> UnionAB = new List<IBase>(A);
UnionAB.AddRange(B);