如何在linq表达式的where子句中访问子实体的属性?

时间:2012-12-27 09:17:33

标签: linq linq-to-sql

我已经问了类似的问题,但不是很精确,所以我会再做一次。

假设我有一个模型,其中一个实体包含其他实体。有没有办法通过linq查询访问子实体的属性?这是一个例子:

string category = "something";

IEnumerable<string> Items = _itemsRepository.GetItems()
                .Where(i => i.Product.Category == category)
                .OrderBy(i => i.ItemId);

在子句“Where”中我想访问子实体的属性“Category”,(这段代码不起作用)。表“Items”包含表“Products”的外键“ProductId” 所以我想在这里选择产品类别等于“某事”的项目。怎么做到呢?

提前谢谢你!

3 个答案:

答案 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>或者您的实体被称为。