LINQ Select语句与EF - 对象初始化器重用分配

时间:2015-07-10 08:50:32

标签: c# linq entity-framework-6

我的应用程序中有一个案例,我以这种方式在IQueryable上创建选择:

myContext.Data
    .Where(...)
    .OrderBy(...)
    .Select(p => new MyDataModel()
    {
        ...
        MyComplexProp = p.SomeProp.HasValue ? p.OtherProp.Name + " " + p.AnotherProp.Mark : p.EvenAnotherProp.Name,
        ...
    });

现在,MyComplexProp的分配用于多个地方,我想将其提取到一个地方,以便我可以重复使用它。有没有人知道如何实现这一目标?

我不能使用静态方法,因为在此阶段不能执行IQueryable

2 个答案:

答案 0 :(得分:1)

将新构造函数添加到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()。这意味着构造函数可以在内存中执行,但您仍然会延迟执行查询。

要实现完整的数据库端执行,您需要将逻辑转换为表达式。你可能正在创建一个表达式树。

答案 1 :(得分:0)

我已经针对您的问题测试了扩展方法,并且它可以正常运行。 以下是示例代码:

namespace MyExtensionMethods
{
    //MyDataModel sample
    public class MyDataModel
    {
        public int? SomeProp { get; set; }
        public string OtherPropName { get; set; }
        public string AnotherPropMark { get; set; }
        public string EvenAnotherPropName { get; set; }
    }

    //The extension Method
    public static class ExtensionMethod
    {
        public static string ToMyComplexProp(this MyDataModel p)
        {
            return p.SomeProp.HasValue ? p.OtherPropName + " " + p.AnotherPropMark : p.EvenAnotherPropName;
        }
    }

    public class TestClass
    {
        MyDataModel myDataModel;
        public TestClass()
        {
            myDataModel = new MyDataModel();
            //This is the extension method and it's working
            myDataModel.ToMyComplexProp();
        }
    }
}

如果您尝试使用扩展方法并且它不适合您,那么您就错误地声明了它。扩展方法的灵魂目的是针对这样的情况(就像Linq使用它一样)。

我建议您查看MSDN Extension Method示例以正确使用它。