C# 两个不同列表类的通用列表,而不是列表<;动态>;

C# 两个不同列表类的通用列表,而不是列表<;动态>;,c#,linq,generics,C#,Linq,Generics,我根据某些条件查询两个不同的视图,它返回集合,然后使用集合执行一些操作 List<dynamic> query = new List<dynamic>(); if (source == 1) { query = this.db.table1.Where(x => x.DATA_SRC_ID == source || x.DATA_SRC_ID == 3).ToList<dynami

我根据某些条件查询两个不同的视图,它返回集合,然后使用集合执行一些操作

List<dynamic> query = new List<dynamic>();
            if (source == 1)
            {
                query = this.db.table1.Where(x => x.DATA_SRC_ID == source || x.DATA_SRC_ID == 3).ToList<dynamic>();
            }
            else if (source == 2)
            {
                query = this.db.table2.Where(x =>  x.DATA_SRC_ID == 3).ToList<dynamic>();
            }

            var result = query.Where(x => x.client_id == clientId).ToList();
视图/表格

table1
table2

如何为两个不同的类装饰列表,而不是
List

最简单的实现(不是最好的实现)是将每个项都转换到所需的类中,使您的类型列表
对象

var list = new List<object>();
list.Add(newInstanceOfA);
list.Add(newInstanceOfB);
如果两个类实现相同的公共接口,则效果更好:

interface IMyInterface 
{
    void DoSomething();
}
class A : IMyInterface {}
class B : IMyInterface {}
现在,您可以轻松创建新列表:

var list = new List<IMyInterface>();
list.Add(newInstanceOfA);
list.Add(newInstanceOfB);

foreach(var element in list)
{
    element.DoSomething();
}
var list=newlist();
list.Add(newInstanceOfA);
list.Add(newInstanceOfB);
foreach(列表中的var元素)
{
元素DoSomething();
}
在您的示例中,您现在可以执行以下操作:

query = this.db.table1
    .Where(x => x.DNA_PGM_PRTN_ID == partitionId && (x.DATA_SRC_ID == source || x.DATA_SRC_ID == 3))
    .Cast<IMyInterface>().ToList();
query=this.db.table1
其中(x=>x.DNA_PGM_PRTN_ID==partitionId&&(x.DATA_SRC_ID==source | | x.DATA_SRC_ID==3))
.Cast().ToList();

query=this.db.table2
其中(x=>x.CLIENT_PGM_PRTN_ID==partitionId&&(x.DATA_SRC_ID==source | | x.DATA_SRC_ID==3))
.Cast().ToList();
分别地


编辑:为了将字段抽象为某种常见形式,您必须使用继承自的抽象类,而不是使列表成为
列表的接口。最简单的实现(不是最好的实现)是将每个项简单地转换为所需的类,使您的列表成为
对象

var list = new List<object>();
list.Add(newInstanceOfA);
list.Add(newInstanceOfB);
如果两个类实现相同的公共接口,则效果更好:

interface IMyInterface 
{
    void DoSomething();
}
class A : IMyInterface {}
class B : IMyInterface {}
现在,您可以轻松创建新列表:

var list = new List<IMyInterface>();
list.Add(newInstanceOfA);
list.Add(newInstanceOfB);

foreach(var element in list)
{
    element.DoSomething();
}
var list=newlist();
list.Add(newInstanceOfA);
list.Add(newInstanceOfB);
foreach(列表中的var元素)
{
元素DoSomething();
}
在您的示例中,您现在可以执行以下操作:

query = this.db.table1
    .Where(x => x.DNA_PGM_PRTN_ID == partitionId && (x.DATA_SRC_ID == source || x.DATA_SRC_ID == 3))
    .Cast<IMyInterface>().ToList();
query=this.db.table1
其中(x=>x.DNA_PGM_PRTN_ID==partitionId&&(x.DATA_SRC_ID==source | | x.DATA_SRC_ID==3))
.Cast().ToList();

query=this.db.table2
其中(x=>x.CLIENT_PGM_PRTN_ID==partitionId&&(x.DATA_SRC_ID==source | | x.DATA_SRC_ID==3))
.Cast().ToList();
分别地



编辑:为了将字段抽象为某种常见形式,您必须使用继承自的抽象类,而不是将列表变成
列表的接口。您可能的类应该实现相同的通用接口(或基类)。然后您可以简单地构建一个列表
list
。尽管如此:“列表会降低性能”是谁说的?既然它是一个
if
else if
,为什么不把
结果=…
放在这两个函数中呢?除了使代码稍微长一点之外,它还变得更容易理解和管理,您只需使用
var query=…
@KeyurPATEL是的,您是对的。但是在得到结果之后,我也做了很多其他的事情。为什么最后一行的where子句不是if-else中where子句的一部分呢。这样,最后一行的过滤是在内存中完成的,但是如果在if/else中添加该子句,它将由数据库完成,这也会对性能有所帮助。因为您已经确定这两种类型之间有一些共同点,所以将它们放在同一个列表中,使其正式化。对于这两种类型,可以从相同的基类继承,也可以实现相同的接口。如果你不能做到这一点,考虑包装在一个第三和第四对象,既继承同样的基类或实现相同的接口,并知道这两个实际对象之间的差异。您可能的类应该实现相同的公共接口(或基类)。然后您可以简单地构建一个列表
list
。尽管如此:“列表会降低性能”是谁说的?既然它是一个
if
else if
,为什么不把
结果=…
放在这两个函数中呢?除了使代码稍微长一点之外,它还变得更容易理解和管理,您只需使用
var query=…
@KeyurPATEL是的,您是对的。但是在得到结果之后,我也做了很多其他的事情。为什么最后一行的where子句不是if-else中where子句的一部分呢。这样,最后一行的过滤是在内存中完成的,但是如果在if/else中添加该子句,它将由数据库完成,这也会对性能有所帮助。因为您已经确定这两种类型之间有一些共同点,所以将它们放在同一个列表中,使其正式化。对于这两种类型,可以从相同的基类继承,也可以实现相同的接口。如果你也不能这样做,考虑将第三和第四对象中的两个对象都再次从同一个基类继承或实现相同的接口,并且知道两个实际对象之间的差异。如果属性非常不同,并且您无法将它们包装为任何常见的属性,那么您应该问问自己,为什么要将它们放在一个列表中(记住:它们反映的是完全不同的东西)。因为这里我们映射的是字段,而不是任何常见的函数,因此,抽象类比Interface@HimBromBeere考虑这两个类之间的共有5个属性,如果我把这5个属性放在接口中,那么如何通过显式类型化来访问QueId之外的剩余属性,如果你知道里面有哪一个对象,除了这个,这可以归结为我发布的第一个解决方案,但是通过接口至少有一些抽象,所以它不是非泛型的。Yeap,如果两个类共享相同的属性,你可以这样做。如果属性非常不同,并且您不能将它们包装成任何通用的属性,那么您应该问问自己,为什么要将它们放在一个列表中(记住:它们反映的是完全不同的东西)。因为这里我们映射的是字段,而不是任何通用函数,因此抽象类比Interface@Him