如何为 List<string>、Expression<Func<T,bool> 创建 MemberExpression>
How to create a MemberExpression for List<string>, for Expression<Func<T,bool>>
以下是我获取 Expression<Func<T,bool>>
的代码,它有助于提供 Func<T,bool>
,用于列表过滤,现在为此我需要创建一个 MemberExpression
,如下所示(在代码中):
MemberExpression memberExpressionColumn = Expression.Property(parameterType,"X");
其中 X
是用于过滤的 属性 的名称,因此当我将其应用于 List<Person>
时,很容易将 X
替换为 属性 Name
, 但是当我使用 List<string>
作为源时,如何创建 MemberExpression
,这会导致异常
void Main()
{
List<Person> personList = new List<Person>()
{
new Person{ Name = "Shekhar", Age = 31},
new Person{ Name = "Sandip", Age = 32},
new Person{ Name = "Pramod", Age = 32},
new Person{ Name = "Kunal", Age = 33}
};
var personNameList = personList.Select(p => p.Name).ToList();
var personNameHashset = new HashSet<string>(personNameList);
var nameList = new List<string>() { "Kunal", "Pramod", "Mrinal" };
var finalExpression = personNameHashset.EqualExpression<string>("Name");
var finalFunc = finalExpression.Compile();
var result = nameList.Where(finalFunc);
result.Dump();
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public static class ExpressionTreesExtension
{
public static Expression<Func<T, bool>> EqualExpression<T>(this HashSet<string> nameHashSet, string columnName)
{
var expressionList = new List<Expression>();
ParameterExpression parameterType = Expression.Parameter(typeof(T), "obj");
// Exception Here - How to create MemberExpression for primitive type list List<string>
MemberExpression memberExpressionColumn = Expression.Property(parameterType,columnName);
var containsMethodInfo = typeof(StringListExtensions).GetMethod("Contains", new[] { typeof(string), typeof(HashSet<string>) });
ConstantExpression constant = Expression.Constant(nameHashSet, typeof(HashSet<string>));
var resultExpression = Expression.Call(null, containsMethodInfo, memberExpressionColumn, constant);
return Expression.Lambda<Func<T, bool>>(resultExpression, parameterType);
}
}
public static class StringListExtensions
{
/// <summary>
/// String Extension - Contains (Substring)
/// </summary>
/// <param name="source"></param>
/// <param name="subString"></param>
/// <returns></returns>
public static bool Contains(this string name, HashSet<string> nameHashSet)
{
return nameHashSet.Contains(name);
}
}
据我所知,您需要得到这样的结果:
var result = nameList.Where(obj => personNameHashset.Contains(obj));
因为你不需要从字符串中得到 Name
属性 你不应该使用 memberExpressionColumn
你可以用 [=16= 调用 containsMethodInfo
].你可以简化你的方法来得到 Expression<Func<T, bool>>
这样的
public static Expression<Func<T, bool>> EqualExpression<T>(this HashSet<string> nameHashSet)
{
ParameterExpression parameterType = Expression.Parameter(typeof(T), "obj");
var containsMethodInfo = typeof(StringListExtensions).GetMethod("Contains", new[] { typeof(string), typeof(HashSet<string>) });
ConstantExpression constant = Expression.Constant(nameHashSet, typeof(HashSet<string>));
var resultExpression = Expression.Call(null, containsMethodInfo, parameterType, constant);
return Expression.Lambda<Func<T, bool>>(resultExpression, parameterType);
}
并称它为:
var finalExpression = personNameHashset.EqualExpression<string>();
var finalFunc = finalExpression.Compile();
var result = nameList.Where(finalFunc);
以下是我获取 Expression<Func<T,bool>>
的代码,它有助于提供 Func<T,bool>
,用于列表过滤,现在为此我需要创建一个 MemberExpression
,如下所示(在代码中):
MemberExpression memberExpressionColumn = Expression.Property(parameterType,"X");
其中 X
是用于过滤的 属性 的名称,因此当我将其应用于 List<Person>
时,很容易将 X
替换为 属性 Name
, 但是当我使用 List<string>
作为源时,如何创建 MemberExpression
,这会导致异常
void Main()
{
List<Person> personList = new List<Person>()
{
new Person{ Name = "Shekhar", Age = 31},
new Person{ Name = "Sandip", Age = 32},
new Person{ Name = "Pramod", Age = 32},
new Person{ Name = "Kunal", Age = 33}
};
var personNameList = personList.Select(p => p.Name).ToList();
var personNameHashset = new HashSet<string>(personNameList);
var nameList = new List<string>() { "Kunal", "Pramod", "Mrinal" };
var finalExpression = personNameHashset.EqualExpression<string>("Name");
var finalFunc = finalExpression.Compile();
var result = nameList.Where(finalFunc);
result.Dump();
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public static class ExpressionTreesExtension
{
public static Expression<Func<T, bool>> EqualExpression<T>(this HashSet<string> nameHashSet, string columnName)
{
var expressionList = new List<Expression>();
ParameterExpression parameterType = Expression.Parameter(typeof(T), "obj");
// Exception Here - How to create MemberExpression for primitive type list List<string>
MemberExpression memberExpressionColumn = Expression.Property(parameterType,columnName);
var containsMethodInfo = typeof(StringListExtensions).GetMethod("Contains", new[] { typeof(string), typeof(HashSet<string>) });
ConstantExpression constant = Expression.Constant(nameHashSet, typeof(HashSet<string>));
var resultExpression = Expression.Call(null, containsMethodInfo, memberExpressionColumn, constant);
return Expression.Lambda<Func<T, bool>>(resultExpression, parameterType);
}
}
public static class StringListExtensions
{
/// <summary>
/// String Extension - Contains (Substring)
/// </summary>
/// <param name="source"></param>
/// <param name="subString"></param>
/// <returns></returns>
public static bool Contains(this string name, HashSet<string> nameHashSet)
{
return nameHashSet.Contains(name);
}
}
据我所知,您需要得到这样的结果:
var result = nameList.Where(obj => personNameHashset.Contains(obj));
因为你不需要从字符串中得到 Name
属性 你不应该使用 memberExpressionColumn
你可以用 [=16= 调用 containsMethodInfo
].你可以简化你的方法来得到 Expression<Func<T, bool>>
这样的
public static Expression<Func<T, bool>> EqualExpression<T>(this HashSet<string> nameHashSet)
{
ParameterExpression parameterType = Expression.Parameter(typeof(T), "obj");
var containsMethodInfo = typeof(StringListExtensions).GetMethod("Contains", new[] { typeof(string), typeof(HashSet<string>) });
ConstantExpression constant = Expression.Constant(nameHashSet, typeof(HashSet<string>));
var resultExpression = Expression.Call(null, containsMethodInfo, parameterType, constant);
return Expression.Lambda<Func<T, bool>>(resultExpression, parameterType);
}
并称它为:
var finalExpression = personNameHashset.EqualExpression<string>();
var finalFunc = finalExpression.Compile();
var result = nameList.Where(finalFunc);