首页 > 解决方案 > C# - EF Lambda Include 用于选择 2 个类并从第二个类中排除属性

问题描述

我正在尝试找到一个解决方案来避免从我的其他类中选择其他属性。

假设我有 2 个名为 Class1 和 Class2 的类,我只想在 Class2 中选择 Name1。

// My Models
public class Class1 {
    public int Class1Id {get;set;}
    public string Gender {get;set;}
    public ICollection<Class2> Class2 {get;set;}
}

public class Class2{
    public int Class2Id {get;set;}
    public string Name1 {get;set;}
    public string Name2 {get;set;}
    public string Name3 {get;set;}
    public string Name4 {get;set;}
    public string Name5 {get;set;}
    public string Name6 {get;set;}

    public int Class1Id {get;set;}
    public Class1 Class1 {get;set;}
}

我有一个方法可以获取 Class1 中的所有记录

public IQueryable<Class1> AllClass1(){
     return context.Class1.Include(c=>c.Class2);
}

这会起作用,但问题是,我只想选择 Class2.Name1。因为在Include中,它选择了Class2中的其他属性。不仅是 Name1,还有 Name2-Name6。

这是出于性能角度和数据获取速度的考虑。

既然我不需要 Name2-Name6,我为什么还要选择获取它们呢?

标签: c#entity-frameworklambdaentity-framework-core

解决方案


只需选择您的属性作为字符串数组

context.Class1.Include(c => c.Class2).SelectMany(x => x.Class2).Select(x => x.Prop1)

如果你想要你的类类型的数组中的属性,只需在 select 方法中创建它的一个新实例

context.Class1.Include(c=>c.Class2).SelectMany(x => x.Class2).Select(x => new Class2() { Prop1 = x.Prop1 })

如果您希望 Class2 实例成为 Class1 的一部分,您可以在 Class1 上执行 Select,但在 Select 中创建 Class1 的新实例,在其中映射 Class1 的每个属性并设置 Class2 数组,如上面的代码

context.Class1.Include(c=>c.Class2).Select (x => new Class1() {
  Prop1 = x.Prop1,
  Prop2 = x.Prop2,
  ...
  Class2 = x.Class2.Select(y => new Class2() { Prop1 = y.Prop1 })
})

另请参阅 如何在 Entity Framework 6.1 中仅加载子对象的某些字段?


推荐阅读