C# - EF Lambda 包含,用于选择 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。因为在"包含"中,它从 Class2 中选择其他属性。不仅是名称 1,还有名称 2-名称 6。

这是出于性能角度以及获取数据的速度。

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

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

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 上进行选择,但在 选择映射 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 })
})

参见 如何在实体框架 6.1 中仅加载子对象的某些字段?

最新更新