我的问题有点难以解释,所以请耐心等待,我会尝试解释我能做的最好的事情并尽我所能提供最多的信息。
所以我有两张桌子:
[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,但这也没有解决我的问题。
答案 0 :(得分:0)
尝试调用ToList()来枚举结果。
答案 1 :(得分:0)
这是因为(x, y) => x
只能选择商店,而不会从查询中选择任何商品。 EF总是试图确定作为查询一部分的实体是否真的对最终结果产生影响。如果没有,他们将被忽略。在这种情况下,items
没有区别,因为 -
实际上,您只查询Shops
,我认为生成的SQL只会在此表上显示一个简单的查询。
请注意,GroupJoin
与Include
不同。如果您想要商店和他们的商品,您必须使用Include
声明来获取商店。这个存储库层的问题在于,这可能会引发责任冲突(在架构上,也就是技术上)。