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

RWe*_*ndi 6 .net c# linq linq-to-sql

请考虑以下代码

IQueryable<FooBar> fooBarQuery = _fooBar;
IQueryable<FooBaz> fooBazQuery = _fooBaz;
IQueryable<IFoo> mergedQuery = _fooBar.Cast<IFoo>().Concat(_fooBaz.Cast<IFoo>());
Run Code Online (Sandbox Code Playgroud)

以上将合并_fooBar和_fooBaz.但是,合并查询列表中的对象类型将全部更改为FooBar.如果我将concat(_fooBaz concat转换为_fooBar),对象类型将更改为FooBaz.

我相信,由于这个随后的mergedQuery连接会抛出这个错误:"Union或Concat中的类型以不同的顺序分配成员."

任何人都可以帮我如何合并不同子类型的多个IQueryable列表?

nli*_*ips 8

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

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
        ...
    });
Run Code Online (Sandbox Code Playgroud)


ojl*_*ecd 0

你是这个意思?

    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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的努力,我的意思是 linq to sql。 (2认同)