我正在使用 Microsoft 实体框架。考虑以下示例代码:
public class person
{
public int Id { get; set;}
public string Name { get; set;}
public string DisplayName{ get; set;}
public string OtherStuff{get; set;}
}
public MyContext : DbContext
{
public class DbSet<person> persons {get; set;}
}
// In the main...
using(MyContext context = new MyContext)
{
var results = context.persons
.Where(p => p.Name == "someName")
.FirstOrDefault();
}
我想在查询实际运行之前根据Where 子句的参数进行一些处理。 如果可能的话,我想访问属性、比较器和参数。
本质上,我想重写 were 子句,以便我可以进行一些预处理,然后完成查询并返回结果。有没有一种机制可以做到这一点? 我希望它特定于这个特定的 DBContext 并且对调用者透明。
例如,我想创建 Name 属性的哈希,然后用它来查找数据库中的人员记录。
再举一个例子,我想记录每个已查找到的名称,一旦此操作完成,只需返回数据即可。
谢谢
这当然可以做到!只是和你想象的略有不同。
我们需要为集合引入新的扩展方法,它的工作原理与
Where
一样,但有一些“额外的步骤”。当然,方法的名称由您决定,只要确保避免与原始 Where
方法产生歧义即可。
这是示例实现:
public static class WhereExtension
{
public static IQueryable<T> WhereWithPreproess<T>(
this IQueryable<T> query,
Expression<Func<T, bool>> predicate)
{
var parameters = predicate.Parameters;
foreach (var parameter in parameters)
Console.WriteLine("Parameter: " + parameter);
if (!(predicate.Body is BinaryExpression body)) return query.Where(predicate);
var left = body.Left;
var right = body.Right;
var method = body.Method;
Console.WriteLine("Left: " + left);
Console.WriteLine("Right: " + right);
Console.WriteLine("Method: " + method);
return query.Where(predicate);
}
}
此代码:
var people = new List<Person>().AsQueryable();
var processed = people.WhereWithPreproess(x => x.Name == "some name");
输出:
Parameter: x
Left: x.Name
Right: "some name"
Method: Boolean op_Equality(System.String, System.String)