我希望使用params string [] args并将其转换为Entity Framework的lambda表达式。
像这样......
public main(params string[] args)
{
DataContext context = new DataContext();
foreach(string arg in args)
{
//build Query
}
context.Things.Where(/*Query*/);
}
答案 0 :(得分:0)
您可以使用动态linq创建基于字符串的表达式。 https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
缺点是这些表达式是在运行时进行评估的,因此您无法在编译时捕获错误。
或者您可以使用表达式树来构造表达式。 https://msdn.microsoft.com/en-us/library/bb882637(v=vs.110).aspx
这将是更多代码,但您将获得编译时类型检查的优势。
答案 1 :(得分:0)
这里有一篇优秀的文章https://www.codeproject.com/Articles/1079028/Build-Lambda-Expressions-Dynamically
这是我的解决方案:
public static Expression<Func<TClass, bool>> ConvertParamArgsToExpression<TClass>(string[] args)
{
Expression finalExpression = Expression.Constant(true);
var parameter = Expression.Parameter(typeof(TClass), "x");
foreach (string arg in args) {
string[] values = arg.Split('=');
PropertyInfo prop = typeof(TClass).GetProperty(values[0]);
if(prop != null)
{
Expression expression = null;
var member = Expression.Property(parameter, prop.Name);
var constant = Expression.Constant(values[1]);
expression = Expression.Equal(member, constant);
finalExpression = Expression.AndAlso(finalExpression, expression);
}
}
return (Expression.Lambda<Func<TClass, bool>>(finalExpression, parameter));
}
用法:
Expression<Func<AdminPageObject, bool>> expression = LambdaConverter.ConvertParamArgsToExpression<AdminPageObject>(args);
if(expression != null)
{
items = items.Where(expression);
}