2011-02-05 66 views
1

我发现了一些看起来相似的问题,但不完全一样,所以我会为它做。结合了2个IQueryable结果

我使用EF检索2个表。这些表/实体没有真正的“是”关系。他们恰好有一些常用字段,我想在包含两个表格之间的组合的前N个条目的列表中公开。每一行都必须有某种方式来识别它是哪种类型以及它指向哪个实例。

我已经解决了这个问题,但我想我想知道是否有更好的方法。我的解决方案是创建一个视图模型类:

intenal class EntityAEntityBCombination 
{ 
    public int? EntityAID { get; set; } 
    public int? EntityBID { get; set; } 
    public string CommonProperty { get; set; } 
} 

然后我做了这一点:

var results = (
    from a in EntityAList select new EntityAEntityBCombination 
     { EntityAID = a.Id, EntityBID = null, CommonProperty = a.CommonProperty } 
    ).Concat(
    from b in EntityBList select new EntityAEntityBCombination 
     { EntityAID = null, EntitiyBID = b.Id, CommonProperty = b.CommonProperty } 
    ).Fetch(N) 

它的工作原理,但似乎很脏。有什么建议么?

+1

可以`EntityA`和`EntityB`没有使用相同的接口和那么你返回一个`List `它包含它们两个?对于我来说,看起来比给匿名类型更多的OOP。 – Bazzz 2011-02-05 11:35:01

+0

我认为一个界面是要走的路。 – carlsb3rg 2011-02-05 14:41:55

回答

2

看一看这个,也许这是行不通开箱的,但它应该给你一个想法:

public class EntityA : IEntity 
{} 

public class EntityB : IEntity 
{} 

List<IEntity> results = 
(from a in EntityAList select a).Cast<IEntity>() 
.Concat(
(from b in EntityBList select b).Cast<IEntity>() 
) 
.Fetch(N).ToList(); 

foreach (IEntity entity in results) 
{ 
if (entity is EntityA) 
    // do something with entity A 

if (entity is EntityB) 
    // do something with entity B 
}