C# LINQ到SQL,如何合并不同子类型的多个IQueryable列表?

C# LINQ到SQL,如何合并不同子类型的多个IQueryable列表?,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,考虑以下代码 IQueryable<FooBar> fooBarQuery = _fooBar; IQueryable<FooBaz> fooBazQuery = _fooBaz; IQueryable<IFoo> mergedQuery = _fooBar.Cast<IFoo>().Concat(_fooBaz.Cast<IFoo>()); IQueryable fooBarQuery=\u fooBar; IQueryable f

考虑以下代码

IQueryable<FooBar> fooBarQuery = _fooBar;
IQueryable<FooBaz> fooBazQuery = _fooBaz;
IQueryable<IFoo> mergedQuery = _fooBar.Cast<IFoo>().Concat(_fooBaz.Cast<IFoo>());
IQueryable fooBarQuery=\u fooBar;
IQueryable fooBazQuery=_fooBaz;
IQueryable mergedQuery=\u fooBar.Cast().Concat(\u fooBaz.Cast());
以上内容将合并_fooBar和_fooBaz。但是,合并查询列表中的对象类型将全部更改为FooBar。如果我翻转concat(_foobazconcat到_fooBar),对象类型将更改为fooBaz

我相信,由于mergedQuery上的后续concat将抛出此错误:“Union或concat中的类型以不同的顺序分配了成员。”

有谁能帮我合并不同子类型的多个IQueryable列表吗?

你是说这个

    List<FooBar> list = new List<FooBar> 
    {
        new FooBar{ r=1},
        new FooBar{ r=2},
        new FooBar{ r=3},
    };
    List<FooBaz> list2 = new List<FooBaz> 
    {
        new FooBaz{ z=4},
        new FooBaz{ z=5},
        new FooBaz{ z=6},
    };
    IQueryable<IFoo> fooBarQuery = list.AsQueryable();
    IQueryable<IFoo> fooBazQuery = list2.AsQueryable();
    IQueryable<IFoo> mergedQuery = fooBarQuery.Concat(fooBazQuery);
    foreach (var obj in mergedQuery)
        Console.WriteLine(obj);
}

interface IFoo
{ }

class FooBar:IFoo {
    public int r { get; set; }
}

class FooBaz : IFoo
{
    public int z { get; set; }
}
List List=新列表
{
新FooBar{r=1},
新FooBar{r=2},
新FooBar{r=3},
};
列表2=新列表
{
新FooBaz{z=4},
新FooBaz{z=5},
新FooBaz{z=6},
};
IQueryable fooBarQuery=list.AsQueryable();
IQueryable fooBazQuery=list2.AsQueryable();
IQueryable mergedQuery=fooBarQuery.Concat(fooBazQuery);
foreach(mergedQuery中的var obj)
控制台写入线(obj);
}
接口IFoo
{ }
类FooBar:IFoo{
公共int r{get;set;}
}
类FooBaz:IFoo
{
公共int z{get;set;}
}

解决方案是使用中间对象:

interface IFoo
{
    int PorpertyA { get; }
    int PorpertyB { get; }
    ...
}

class FooImpl : IFoo
{
    public int PorpertyA { get; set; }
    public int PorpertyB { get; set; }
    ...
}

IQueryable<IFoo> mergedQuery =
    fooBarQuery.Select(x => new FooImpl {
        PropertyA = x.PropertyA,
        PropertyB = x.PropertyB
        ...
    })
    .Union(fooBazQuery.Select(x => new FooImpl {
        PropertyA = x.PropertyA,
        PropertyB = x.PropertyB
        ...
    });
接口IFoo
{
int PorpertyA{get;}
int PorpertyB{get;}
...
}
类FooImpl:IFoo
{
公共int PorpertyA{get;set;}
公共int PorpertyB{get;set;}
...
}
IQueryable合并查询=
选择(x=>newfooimpl{
PropertyA=x.PropertyA,
PropertyB=x.PropertyB
...
})
.Union(fooBazQuery.Select(x=>newfooimpl{
PropertyA=x.PropertyA,
PropertyB=x.PropertyB
...
});

另一种可能的解决方案是使用公共基类而不是接口。通过这种方式实现的所有实体都已在同一集中,因此您不必合并它们

class FooBase
{
    // ...
}

class FooBar : FooBase
{
    // ...
}

class FooBaz : FooBase
{
    // ...
}
要分离FooBase集中的不同子类型,请使用:

i任何东西都可以;
IQueryable only foobars=类型()的所有内容;

您提供的代码本身合并了两个不同子类型的IQueryable列表。可能是我没有正确理解问题陈述。我使用了以下代码

        List<FooBar> lstFooBar = new List<FooBar>() { new FooBar() { r = 1 } };
        List<FooBaz> lstFooBaz = new List<FooBaz>() { new FooBaz() { z = 2 } };

        IQueryable<FooBar> fooBarQuery = lstFooBar.AsQueryable<FooBar>();
        IQueryable<FooBaz> fooBazQuery = lstFooBaz.AsQueryable<FooBaz>();

        IQueryable<IFoo> mergedQuery = fooBazQuery.Cast<IFoo>  
                                       ().Concat(fooBarQuery.Cast<IFoo>());
请参阅以下附件,合并查询的两个成员属于不同类型,而不是相同类型。如果存在任何理解问题,请让我知道


我不明白你的问题,或者这个

IQueryable<FooBar> fooBarQuery = _fooBar;
IQueryable<FooBaz> fooBazQuery = _fooBaz;
IQueryable<IFoo> mergedQuery = _fooBar.Cast<IFoo>().Concat(_fooBaz.Cast<IFoo>()).As<IFoo>();
IQueryable fooBarQuery=\u fooBar;
IQueryable fooBazQuery=_fooBaz;
IQueryable mergedQuery=_fooBar.Cast().Concat(_fooBaz.Cast()).As();

谢谢你的努力,我的意思是linq to sql。我的答案正确吗?谢谢你澄清遗漏了什么。很抱歉,你的答案没有解决我的解决方案。因为我需要将我的对象保留为其具体对象。具体对象是什么意思?你的数据存储在sql Server、EF(或linq2sql)中从这些数据构造对象。这些对象如何比上面代码中构建的对象更具体?根据您的说法,上面的FooImpl类无法实现的功能是什么?
 interface IFoo
  {
    int A { get; set; }
   }

class FooBar : IFoo
{
    public int r { get; set; }
    public int A { get; set; }
}

class FooBaz : IFoo
{
    public int z { get; set; }
    public int A { get; set; }
}
IQueryable<FooBar> fooBarQuery = _fooBar;
IQueryable<FooBaz> fooBazQuery = _fooBaz;
IQueryable<IFoo> mergedQuery = _fooBar.Cast<IFoo>().Concat(_fooBaz.Cast<IFoo>()).As<IFoo>();