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>();