我已经问了类似的问题,但不是很精确,所以我会再做一次。
假设我有一个模型,其中一个实体包含其他实体。有没有办法通过linq查询访问子实体的属性?这是一个例子:
string category = "something";
IEnumerable<string> Items = _itemsRepository.GetItems()
.Where(i => i.Product.Category == category)
.OrderBy(i => i.ItemId);
在子句“Where”中我想访问子实体的属性“Category”,(这段代码不起作用)。表“Items”包含表“Products”的外键“ProductId” 所以我想在这里选择产品类别等于“某事”的项目。怎么做到呢?
提前谢谢你!
答案 0 :(得分:1)
正如其他人在评论中所说,提供有关错误的更多信息将有助于我们回答您的问题。
您是否收到空引用异常?
如果是这样,请确保将您的子实体/导航属性包含在方法_itemsRepository.GetItems()
中正在执行的linq语句或查询中。
实体框架不会加载您的相关对象,除非您告诉它。我建议您使用.Include()
方法急切加载您的媒体资源。您需要在GetItems()
内执行的任何查询中执行此操作。您还可以使用延迟加载来访问子属性。这篇文章解释了一些。
http://msdn.microsoft.com/en-us/magazine/hh205756.aspx
希望有所帮助。
答案 1 :(得分:1)
IEnumerable<Item> Items = _itemsRepository.GetItems()
.Where(i => category == null ||
(i.Product != null &&
i.Product.Category == category))
.OrderBy(i => i.ItemId);
答案 2 :(得分:0)
您缺少一个select子句
IEnumerable<string> Items = _itemsRepository.GetItems()
.Where(i => i.Product.Category == category)
.OrderBy(i => i.ItemId)
.Select(i => i.Name); //<- or whatever string property you expect to get out
否则,您不应该IEnumerable<string>
而是IEnumerable<Item>
或者您的实体被称为。