C# - EF Lambda Include用于选择2个类并排除第二个类的属性

时间:2018-05-10 14:02:31

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

我试图找到一个如何避免从我的其他课程中选择其他属性的解决方案。

假设我有两个名为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,为什么我也会选择取这些?

1 个答案:

答案 0 :(得分:2)

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

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 })
})

另见 How to only load certain fields of a child object in Entity Framework 6.1?