【问题标题】:Combining 2 IQueryable results结合 2 个 IQueryable 结果
【发布时间】:2011-06-21 20:27:07
【问题描述】:

我发现了一些看起来相似但不完全相同的问题,所以我会去。

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

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

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)

它有效,但看起来很脏。有什么建议吗?

【问题讨论】:

  • 可以EntityAEntityB 不使用相同的接口,然后你返回一个包含它们的List<IEntity> 吗?对我来说,这似乎比返回匿名类型更 OOP。
  • 我认为接口是要走的路。

标签: c# asp.net-mvc linq entity-framework-4 linq-to-entities


【解决方案1】:

看看这个,也许它不能直接开箱即用,但它应该给你一个想法:

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
}

【讨论】:

  • 我想我最终可能会做这样的事情。
  • 你有什么理由不喜欢这样的结局吗?我对改进这个想法的建议持开放态度。 :)
  • 我试图让我的结构尽可能简单,试图自学 EF、MVC、IoC 等。没有其他原因真的......
  • 如果您对此感觉更好,可以使用由 EntityA 和 EntityB 继承的 Base 类。实际上它归结为同一件事。 :) 就在您有两个具有“某些”共同点的类时,您的“接口警报”应该开始响起。 :) 我认为您的 EntityAEntityBCombination 类与它没有太大区别。
猜你喜欢
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 2017-12-22
  • 2017-04-29
  • 2017-01-31
相关资源
最近更新 更多