我的应用程序中有一种情况,我以这种方式在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/

10-13 08:51