C# 带有EF-对象初始值设定项重用分配的LINQ Select语句

C# 带有EF-对象初始值设定项重用分配的LINQ Select语句,c#,linq,entity-framework-6,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.EvenAnotherP

我在我的应用程序中有一个案例,我以这种方式在
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()的用法。这意味着构造函数可以在内存中执行,但查询的执行仍将延迟


要实现完全的数据库端执行,需要将逻辑转换为表达式。您可能已经开始创建表达式树了。

我已经为您的问题测试了扩展方法,它可以正常工作。 以下是示例代码:

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是如何使用它的)


我建议您检查示例以正确使用它。

如果
Data
包含
MyDataModel
,则只需将
MyComplexProp
定义为部分类文件中的计算属性,并删除
.Select()
部分-而是添加一个
.List()
。我无法将计算属性放在实体上,因为您不能在Select而不是IQueryable中使用它们。调用ToList不是您尝试使用扩展方法的可选ID?扩展方法也是静态的,不能是静态的used@MateoVelenik除非在查询条件中使用该值,否则没有理由在final.ToList()之后不使用它。如果在查询条件中使用该值,则a。不要,b。您可以使用适用于内存中选择的view.to,但不能使用LINQ中带有参数的构造函数,因为Entities已稍微修改。我认为这是最好的方法,不需要对表达式做大量额外的工作。@Kamyar:不会的-看看AsEnumerable和ToList之间的区别我现在正在阅读关于AsEnumerable的文章-谢谢你的建议,我会尝试看看它生成什么样的SQL。不幸的是,我认为唯一适合的解决方案是自己构建表达式树,正如我之前所说的,这是一个与实体框架相关的问题,静态方法无法转换为SQL。您的解决方案可以在内存中执行,这对于我的情况是不可接受的。