【问题标题】:EF. How to include only some sub results in a model?英孚。如何在模型中只包含一些子结果?
【发布时间】:2018-02-19 21:55:02
【问题描述】:

我正在尝试选择用户列表,并为每个用户工作标题选择正确的语言,这取决于用户选择的 strLang。

类似的东西:

IList<User> myData;
myData = Context.Users.Where(u => u.Location == strLocation)
                .Include(u => u.JobTitles.Where(e => e.Language == strLang))
                    .ToList();

但似乎 Include 不喜欢 Where 子句

【问题讨论】:

  • 你遇到了什么错误?
  • 错误消息:“包含路径表达式必须引用在类型上定义的导航属性。引用导航属性使用虚线路径,集合导航属性使用 Select 运算符。参数名称:路径”跨度>
  • 不,因为我不想创建新模型/对象,我只想减少结果数
  • 试试 Include(u => u.JobTitles).Where(e => e.Language == strLang).ToList();

标签: entity-framework


【解决方案1】:

您不能有条件地仅包含相关集合的少数实体,因此您应该使用投影来获取所需的内容:

IList<User> myData;
var temp = Context.Users.Where(u => u.Location == strLocation)
      .Select(u => new
      {
        User = u;
        Locations = u.JobTitles.Where(e => e.Language == strLang));
      });

foreach(var t in temp)
{
   User user = t.User;
   user.Locations = t.Locations;
   myData.Add(user);
}

【讨论】:

    【解决方案2】:

    你不能使用“Include”方法来做到这一点,因为它只需要导航属性。

    免责声明:我是 github 上 EF+ 项目的所有者。

    EF+ Query IncludeFilter让您轻松过滤相关实体:

    // using Z.EntityFramework.Plus; // Don't forget to include this.    
    IList<User> myData;
        myData = Context.Users.Where(u => u.Location == strLocation)
                        .IncludeFilter(u => u.JobTitles.Where(e => e.Language == strLang))
                            .ToList();
    

    你可以找到项目here

    您可以找到文档here

    在代码后面,IncludeFilter 与 Alexander 的回答完全一样,使用投影。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多