conanak99提供的答案是我认为正确的方法。这些扩展通常已经隐藏在你的核心工具中,因此他的答案具有可重用性。如果您确定只会用于此目的,可以将其重构为。
public static dynamic AppendProperty<T>(this object value, string propertyName, T newValue)
{
IDictionary<string, object> expando = new ExpandoObject();
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType()))
expando.Add(property.Name, property.GetValue(value));
expando.Add(propertyName, newValue);
return expando as ExpandoObject;
}
这将产生以下代码来实现您想要的功能:
var pics = db.AlbumPictures.Where(p => p.AlbumID == album.ID)
.OrderBy(p => p.RankOrder)
.Select(p =>
{
return p.AppendProperty("Thumbnail", ThumbManager.GetThumb(p.ID));
})
.ToList();
更新 ------------------------------
如果您正在使用automapper,或者愿意安装它,这是另一种可以用来实现相同结果的解决方法。
首先,您需要创建一个Album的扩展类,并添加属性。
class AlbumExt : Album
{
public string Thumbnail { get; set; }
}
然后,在选择语句中创建扩展类的新实例,使用自动映射(如果属性不多)或手动复制属性值到新类,并设置缩略图属性。
var pics = db.AlbumPictures.Where(p => p.AlbumID == album.ID)
.OrderBy(p => p.RankOrder)
.Select(p =>
{
AlbumExt tmp = new AlbumExt();
AutoMapper.Mapper.DynamicMap(p, tmp);
tmp.Thumbnail = "new prop value";
return tmp;
})
.ToList();
Automapper基本上只是使用默认约定从一个类复制属性值到另一个类,如果需要可以覆盖这些默认约定。
var data = pics.Select(p => new { ID = p.ID, Name = p.Name, AnotherProperty = p.AnotherProperty, ....., Thumbnail = ThumbManager.GetThumb(p.ID) });
- user3559349