.NET Core 中 IQueryable 中的反射
Reflection within IQueryable in .NET Core
我想知道下面的代码将如何工作以及性能如何。我基本上对第 4 行感兴趣。 linq 和 属性 info 如何协同工作?
换句话说,(int)prop.GetValue(a)
和 a.SomeId
会以相同的方式工作,还是反射需要在检查值之前将所有内容都存入内存?
var prop = type.GetProperty("SomeId");
if (prop != null)
{
DbSet<T> dbSet = _dbContext.Set<T>();
return dbSet.Where(a => (int)prop.GetValue(a) == 1);
}
In other words will (int)prop.GetValue(a)
and a.SomeId
work the same way
没有
根据后备存储,上下文可能无法将该表达式 ((int)prop.GetValue(a)
) 转换为基础查询语法,在大多数情况下为 SQL。
您可以考虑使用 属性 信息手动构建有效表达式。
例如
//Assuming
Type type = typeof(T);
PropertyInfo prop = type.GetProperty("SomeId");
if (prop != null) {
//need to build a => a.SomeId == 1
// a =>
ParameterExpression parameter = Expression.Parameter(type, "a");
// a => a.SomeId
MemberExpression property = Expression.Property(parameter, prop);
// a => a.SomeId == 1
BinaryExpression body = Expression.Equal(property, Expression.Constant(1));
Expression<Func<T, bool>> expression = Expression.Lambda<Func<T, bool>>(body, parameter);
DbSet<T> dbSet = _dbContext.Set<T>();
return dbSet.Where(expression);
}
我想知道下面的代码将如何工作以及性能如何。我基本上对第 4 行感兴趣。 linq 和 属性 info 如何协同工作?
换句话说,(int)prop.GetValue(a)
和 a.SomeId
会以相同的方式工作,还是反射需要在检查值之前将所有内容都存入内存?
var prop = type.GetProperty("SomeId");
if (prop != null)
{
DbSet<T> dbSet = _dbContext.Set<T>();
return dbSet.Where(a => (int)prop.GetValue(a) == 1);
}
In other words will
(int)prop.GetValue(a)
anda.SomeId
work the same way
没有
根据后备存储,上下文可能无法将该表达式 ((int)prop.GetValue(a)
) 转换为基础查询语法,在大多数情况下为 SQL。
您可以考虑使用 属性 信息手动构建有效表达式。
例如
//Assuming
Type type = typeof(T);
PropertyInfo prop = type.GetProperty("SomeId");
if (prop != null) {
//need to build a => a.SomeId == 1
// a =>
ParameterExpression parameter = Expression.Parameter(type, "a");
// a => a.SomeId
MemberExpression property = Expression.Property(parameter, prop);
// a => a.SomeId == 1
BinaryExpression body = Expression.Equal(property, Expression.Constant(1));
Expression<Func<T, bool>> expression = Expression.Lambda<Func<T, bool>>(body, parameter);
DbSet<T> dbSet = _dbContext.Set<T>();
return dbSet.Where(expression);
}