2014-12-09 39 views
0

我的问题有点难以解释,所以请耐心等待,我将尽力解释我所能提供的最好信息,并提供最多的信息。加入两个IQueryables

所以我有两个表:

[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时,它是空的,除非我首先展开项目的结果视图。因此,我的项目不会显示在数据网格中,除非我事先在调试中手动检查项目。我认为问题在于我的项目是IQueryable,我确实尝试将其转换为IEnumerable,但这并没有解决我的问题。

+0

'GetAll'会发生什么?并且这些存储库是否共享相同的上下文? – 2014-12-09 15:20:25

+0

GetAll()返回DBSet。是的,存储库位于相同的上下文中 – 2014-12-09 15:26:43

+0

我认为您的项目中启用了延迟加载,因此您需要加载它们,因此将它们转换为ToList()将有所帮助。 (x => x.LanguageText) 。 – 2014-12-10 03:19:02

回答

0

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

+0

正如我在最后一句中所说的那样,我确实尝试过。 – 2014-12-09 13:21:43

+0

我看不到任何枚举查询中的项目,所以如果您尝试使用ToList和项目查询,那么当您使用toList和最终查询时应该会得到一些结果。 – 2014-12-09 13:28:21

+0

如果我这样做,我会得到以下错误:无法创建类型'Namespace.Item'的常量值。只有原始类型或枚举类型在此上下文中受支持。 – 2014-12-09 13:41:11

0

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

  1. 他们没有预计到的结果集
  2. 联接是外部联接,所以他们没有任何选择性作用。

实际上,您只查询Shops,我认为生成的SQL只会在此表上显示一个简单的查询。请注意0​​与Include不一样。如果您需要商店他们的项目,您必须使用Include声明获取商店。这个存储库层面的问题在于,这可能会引发责任冲突(体系结构上,也就是技术上而言)。