【问题标题】:How to access child entity's property in a where clause of linq expression?如何在 linq 表达式的 where 子句中访问子实体的属性?
【发布时间】:2012-12-27 09:17:32
【问题描述】:

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

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

string category = "something";

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

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

提前谢谢你!

【问题讨论】:

  • 我们能看到型号代码吗?如果导航属性没问题,那么代码看起来没问题。
  • 我使用 linq to sql model first 方法,代码是由数据库模型自动生成的。你认为问题出在模型上?
  • yopu 将其标记为 EF ?是EF还是金属?
  • 你能用你得到的错误更新问题吗(编译时或运行时)
  • 无论有没有 where 子句,您都无法将“项目”分配给 IEnumerable。要么“选择”一个字符串属性,要么更改你的变量类型分配给

标签: linq linq-to-sql


【解决方案1】:
IEnumerable<Item> Items = _itemsRepository.GetItems()
                .Where(i => category == null || 
                           (i.Product != null && 
                            i.Product.Category == category))
                .OrderBy(i => i.ItemId);

【讨论】:

  • 嗨!感谢您的回答!但是,如果我有方法(包装这段代码)并且我将“类别”作为参数传递给该方法怎么办。所以我也希望能够获得所有项目(所有类别)。
  • 为此更新了 linq。
  • @AlekseiChepovoi - 只要 Product 永远不会为空,但如果是,那么在执行查询时您将获得空引用异常。
【解决方案2】:

正如其他人在他们的 cmets 中所建议的那样,提供有关错误的更多信息将有助于我们回答您的问题。

您是否收到空引用异常?

如果是这样,请确保将子实体/导航属性包含在方法 _itemsRepository.GetItems() 中正在执行的 linq 语句或查询中。

实体框架不会加载你的相关对象,除非你告诉它。我建议您使用.Include() 方法急切地加载您的属性。您需要将此作为您在GetItems() 内执行的任何查询的一部分。您还可以使用延迟加载来访问您的子属性。这是一篇解释它的文章。

http://msdn.microsoft.com/en-us/magazine/hh205756.aspx

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    您缺少一个选择子句

        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&lt;string&gt;,而应使用IEnumerable&lt;Item&gt; 或您的实体名称。

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2012-01-05
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多