我正在尋找一種解決方案來根據列名選擇單個列。我要選擇的列型別始終是字串。像這樣:
_dbContext.MyModel.Select("Name")...
我想創建一個擴展方法:
_dbContext.MyModel.SelectFromString("Name")
它應該允許嵌套選擇,例如:
_dbContext.MyModel.SelectFromString("Child.Name")
擴展方法:
public static IQueryable<T> SelectFromString<T>(this IQueryable<T> query, string column)
{
var parameter = Expression.Parameter(typeof(T));
var property = Expression.Property(parameter, column);
//...
return query.Select(lambda);
}
不確定如何創建 lambda。有任何想法嗎?
uj5u.com熱心網友回復:
以下方法將任何屬性投影到字串并回傳 IQueryable<string>
。還支持嵌套屬性。
public static class QueryableExtensions
{
public static IQueryable<string> SelectFromString<T>(this IQueryable<T> query, string column)
{
var parameter = Expression.Parameter(typeof(T), "e");
var property = MakePropPath(parameter, column);
if (property.Type != typeof(string))
{
if (property.Type != typeof(object))
property = Expression.Convert(property, typeof(object));
property = Expression.Call(_toStringMethod, property);
}
var lambda = Expression.Lambda<Func<T, string>>(property, parameter);
return query.Select(lambda);
}
private static Expression MakePropPath(Expression objExpression, string path)
{
return path.Split('.').Aggregate(objExpression, Expression.PropertyOrField);
}
private static MethodInfo _toStringMethod = typeof(Convert).GetMethods()
.Single(m =>
m.Name == nameof(Convert.ToString) && m.GetParameters().Length == 1 &&
m.GetParameters()[0].ParameterType == typeof(object)
);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/498022.html
上一篇:比較串列時xUnit測驗失敗
下一篇:Linq查詢無法翻譯