【发布时间】:2015-05-14 14:13:59
【问题描述】:
给定一个具有任意属性的简单类(为了讨论,可以说 Id、Name 和 Description)
给定该类的一个实例,我想通过指定要匹配的属性在数据库中找到匹配的条目
我正在尝试在这方面做一些类似于 EF 的 AddOrUpdate 方法的事情,但我需要将实体返回给我以进行进一步处理。
var match = new SomeClass{Name="Whatever"};
var found = Context.SomeClass.Find(x=>x.Name, match);
public static T Find<T>(this DbSet<T> set, Expression<Func<T, object>> matchOn, T matchAgainst) where T : class {
var func = matchOn.Compile();
var valueToFind = func(matchAgainst);
var combinedExpression = //matchon + "=" + valueToFind;
var found = set.FirstOrDefault(combinedExpression);
return found;
}
这给了我传入对象中属性的值,但我现在需要将该值与传入的表达式结合起来,并将其传递给数据库集。
IE,我有效尝试运行的代码是 set.FirstOrDefault(x=>x.Name==valueToFind) 我如何获取 matchon 表达式(包含 x=>x.Name)并将其与 ==valueToFind 结合以从他们那里获取 x=>x.Name==valueToFind ?
如何构建组合表达式? (我意识到上面的“字符串”代码是完全错误的,但我试图了解我需要该函数做什么,但我不知道该语法会是什么样子。)
对于手动编码的示例,只需传入带有值集的硬编码 lambda 就很容易了,但我的用例涉及运行对象集合并为每个对象找到匹配项,因此值不会是直到运行时才知道,并且该方法必须适用于任意类型和各种属性,因此我也无法对属性名称进行硬编码。
【问题讨论】:
标签: c# linq entity-framework lambda expression-trees