2015-06-02 74 views
0

我在视图模型中创建了两种几乎相同的映射函数来映射POCO,一个用于Queryables,一个用于Collections。有没有可能创建一个方法,这样既可以删除重复的代码?我只想保留Expression<Func<>>然后在本地集合和实体框架中使用它。Func定义后可能包装Expression <>和Func <>吗?

public class MyViewModel 
{ 
    public static readonly Expression<Func<MyPOCO, MyViewModel>> AsMap = 
     (e) => new ImportPattern 
     { id = e.id, 
      name = e.name 
     } 

    public static readonly Func<MyPOCO, MyViewModel>> ToMap = 
     (e) => new ImportPattern 
     { id = e.id, 
      name = e.name 
     } 

    public int id { get; set; } 
    public string name { get; set; } 
} 

示例:AsMap成功使用实体框架仅投影映射函数中列出的字段。

var a = Product 
     .Where(p => p.id > 0 && p.id < 10) 
     .OrderBy(q => q.id) 
     .Select(ImportPattern.AsMap); 

ToMap成功处理本地集合。

var products = Products.Where(p => p.id > 0 && p.id < 10).ToList(); 
var a = products 
     .OrderBy(q => q.id) 
     .Select(ImportPattern.ToMap); 

本地收藏使用AsMap失败,出现错误Non-invocable member。这里有一些失败:

.Select(ImportPattern.ToMap.Compile().Invoke()) 
.Select(o => ImportPattern.ToMap.Compile().Invoke(o)) 

仅供参考,请不要找AutoMapper()答案。

回答

3

什么

public static readonly Expression<Func<MyPOCO, MyViewModel>> AsMap = 
    (e) => new ImportPattern 
    { id = e.id, 
     name = e.name 
    } 

public static readonly Func<MyPOCO, MyViewModel>> ToMap = AsMap.Compile(); 

它并没有真正伤害,因为你这样做只有一次,但你立刻摆脱了重复的代码。

2

您需要直接通过委托:

Select(ImportPattern.ToMap.Compile()) 

注意Compile()是一个缓慢的呼叫;你应该缓存它的结果。

+0

我希望我可以标记两个答案是正确的。我会确定地使用它们。 –

+0

他们都是一样的:) – MBoros

相关问题