我的应用程序中有一个案例,我以这种方式在IQueryable
上创建选择:
myContext.Data
.Where(...)
.OrderBy(...)
.Select(p => new MyDataModel()
{
...
MyComplexProp = p.SomeProp.HasValue ? p.OtherProp.Name + " " + p.AnotherProp.Mark : p.EvenAnotherProp.Name,
...
});
现在,MyComplexProp
的分配用于多个地方,我想将其提取到一个地方,以便我可以重复使用它。有没有人知道如何实现这一目标?
我不能使用静态方法,因为在此阶段不能执行IQueryable
。
答案 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示例以正确使用它。