我在视图模型中创建了两种几乎相同的映射函数来映射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()答案。
我希望我可以标记两个答案是正确的。我会确定地使用它们。 –
他们都是一样的:) – MBoros