【发布时间】:2016-10-22 03:46:43
【问题描述】:
我有几个自动完成操作,下面列出了其中一个。我没有为每个自动完成 Where 方法编写不同的谓词,而是创建了一个 autoCompletePredicate。由于我有多个自动完成,我使用反射来获取特定自动完成所需的属性,并在我的autoCompletePredicate 中使用该属性。
我有以下工作正常的代码。
static string param1, param2;
static PropertyInfo[] properties;
static PropertyInfo prop1, prop2;
public IHttpActionResult GetAutComplete(string term, string dependent)
{
int pagerSize = 10;
properties = new MyObject().GetType().GetProperties();
prop1 = properties.Where(p => p.Name.ToUpper().Equals("PROP1")).FirstOrDefault();
prop2 = properties.Where(p => p.Name.ToUpper().Equals("PROP2")).FirstOrDefault();
param1 = term;
param2 = dependent;
return Json(context.MyObject.Where(autoCompletePredicate).Select(r => new { label = r.PROP1 }).Distinct().OrderBy(r => r.label).Take(pagerSize).ToList());
}
Func<MyObject, int, bool> autoCompletePredicate = (GF, index) =>
{
bool isFound = false;
string term, dependent;
term = prop1.GetValue(GF).ToString();
dependent = prop2.GetValue(GF).ToString();
var termFound = term.Contains(param1.ToUpper());
var dependentFound = String.IsNullOrEmpty(param2) ? true : dependent.Contains(param2.ToUpper());
isFound = termFound && dependentFound;
return isFound;
};
如何将此代码更改为表达式。我尝试了以下编译好的代码,但在运行时出现以下错误
public static Expression<Func<MyObject, bool>> AutoCompleteExpression()
{
return r => prop1.GetValue(r).ToString().Contains(param1.ToUpper()) && (String.IsNullOrEmpty(param2) ? true : prop2.GetValue(r).ToString().Contains(param2.ToUpper()));
}
"LINQ to Entities 无法识别方法 'System.Object GetValue(System.Object)' 方法,该方法不能翻译 到商店表达式中。”
我查看了以下post,这绝对是有道理的,但我不确定如何在我的场景中使用该示例(使用 Reflection 动态查找属性)。
另外,我想知道使用 Expression vs Func 有什么好处(特别是在我的情况下)
【问题讨论】:
-
提供者正在尝试获取该表达式并从中创建 SQL,在这种情况下它不能这样做。您可以在 Linq-to-Objects 中执行这些表达式,但完全不清楚它应该做什么。
-
@DStanley 我在问题开始时提供了一些解释。请看是否有意义。
标签: c# linq expression func