EF 动态投影(映射到属性-值对的字典)
本文关键字:字典 属性 投影 动态 映射 EF | 更新日期: 2023-09-27 18:37:06
我正在尝试为实体框架实现动态投影,以便能够指定要返回的属性列表 ang 获取值字典作为结果。
public static IQueryable<Dictionary<string, object>> ProjectionMap<TSource>
(IQueryable<TSource> sourceModel, IEnumerable<string> properties)
{
var itemParam = Expression.Parameter(typeof (TSource), "item");
var addMethod = typeof (Dictionary<string, object>).GetMethod("Add");
var elements = properties.
Select(
property =>
Expression.ElementInit(addMethod, Expression.Constant(property),
GetPropertyExpression<TSource>(itemParam, property))).
ToList();
var newDictionaryExpression =
Expression.New(typeof (Dictionary<string, object>));
var dictionaryInit = Expression.ListInit(newDictionaryExpression, elements);
var projection = Expression.Lambda<Func<TSource, Dictionary<string, object>>>(dictionaryInit, itemParam);
return sourceModel.Select(projection);
}
public static Expression GetPropertyExpression<T>(ParameterExpression parameter, string propertyName)
{
var properties = typeof (T).GetProperties();
var property = properties.First(p => p.Name == propertyName);
return Expression.Property(parameter, property);
}
在运行时运行以下代码引发异常
var query = ProjectionMap(db.Posts, new[]{"Subject"});
var result = query.ToList();
不支持异常LINQ to 实体仅支持具有单个元素的列表初始值设定项。
任何想法如何修复代码或建议如何正确实现它?提前谢谢。
我遇到了同样的错误,但可能是出于不同的原因(我没有尝试过你的代码)。希望这对我刚刚添加的人有所帮助.ToList() 在选择之前。我正在选择进入哈希表,我认为问题是sql不知道该怎么做,尽管我习惯于看到不同的错误。无论如何,也许尝试
return sourceModel.ToList().Select(projection);
因为 sourceModel 是你的 IQueryable(起初我打算在属性上建议 ToList(),但这已经是 IEnumerable。