我的应用程序中有一种情况,我以这种方式在IQueryable
上创建选择:
myContext.Data
.Where(...)
.OrderBy(...)
.Select(p => new MyDataModel()
{
...
MyComplexProp = p.SomeProp.HasValue ? p.OtherProp.Name + " " + p.AnotherProp.Mark : p.EvenAnotherProp.Name,
...
});
现在,对
MyComplexProp
的分配在多个地方使用,我想将其提取到一个地方,以便我可以重用它。有谁知道如何实现这一目标?我不能使用静态方法,因为
IQueryable
不能在此阶段执行。 最佳答案
向MyDataModel
添加一个新的构造函数以将该实体作为参数并执行逻辑:
public class MyDataModel
{
public string MyComplexProp {get; set;}
//Include a default constructor
public MyDataModel()
{
}
//Include a default constructor
public MyDataModel(DataClass data)
{
MyComplexProp = data.SomeProp.HasValue ? data.OtherProp.Name + " " + data.AnotherProp.Mark : data.EvenAnotherProp.Name,
}
}
然后,您的linq可以简化为:
myContext.Data
.Where(...)
.OrderBy(...)
.AsEnumerable()
.Select(p => new MyDataModel(p));
请注意AsEnumerable()的用法。这将意味着构造函数可以在内存中执行,但是您仍将推迟执行查询。
为了实现完整的DB端执行,您需要将逻辑转换为表达式。您可能正在创建一个表达式树。
关于c# - 带有EF的LINQ Select语句-对象初始化程序重用分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31336396/