加入两个IQueryables

时间:2014-12-09 13:14:01

标签: entity-framework ienumerable iqueryable outer-join

我的问题有点难以解释,所以请耐心等待,我会尝试解释我能做的最好的事情并尽我所能提供最多的信息。

所以我有两张桌子:

[Table("Items")]
public class Item : BaseModel
{
  [Key]
  [Column("Id")]
  public Guid Id { get; set; }

  [Column("DescriptionId")]
  public Guid DescriptionId { get; set; }

  [ForeignKey("Id")]
  public LanguageText LanguageText { get; set; }

  [ForeignKey("DescriptionId")]
  public LanguageText DescriptionText { get; set; }
}



[Table("Shops")]
 [Serializable]
 public class Shop: BaseModel
{
    [Key]
    [Column("Id")]
    public Guid Id { get; set; }

    [Column("ItemId")]
    public Guid? ItemId{ get; set; }

    [Column("Closed")]
    public DateTime? Closed{ get; set; }

    [ForeignKey("ItemId")]
    public Item ItemModel{ get; set; }
}

我的疑问

var items= itemRepository.GetAll()
                        .Include(x => x.LanguageText)
                        .Include(x => x.DescriptionText);




var querableShops = shopRepository.GetAll()
                        .Where(x =>!x.Closed.HasValue || (x.Closed.HasValue && x.Closed.Value >= Expiration))
                        .GroupJoin(items, s => s.ItemId, i => i.Id, (x, y) => x);

有趣的事情发生在我查询时。当我调试querableShops并想要签出我的ItemModel时,它是null,除非我首先展开项目的Result View。因此,我的项目不会显示在数据网格中,除非我事先在调试中手动检查项目。我认为问题是我的项目是IQueryable,我确实尝试将其转换为IEnumerable,但这也没有解决我的问题。

2 个答案:

答案 0 :(得分:0)

尝试调用ToList()来枚举结果。

答案 1 :(得分:0)

这是因为(x, y) => x只能选择商店,而不会从查询中选择任何商品。 EF总是试图确定作为查询一部分的实体是否真的对最终结果产生影响。如果没有,他们将被忽略。在这种情况下,items没有区别,因为 -

  1. 它们不会投射到结果集
  2. 连接是外连接,因此它们没有任何选择性效果。
  3. 实际上,您只查询Shops,我认为生成的SQL只会在此表上显示一个简单的查询。

    请注意,GroupJoinInclude不同。如果您想要商店他们的商品,您必须使用Include声明来获取商店。这个存储库层的问题在于,这可能会引发责任冲突(在架构上,也就是技术上)。