当然可以,但是您必须了解其中的含义。类型名称Region
是编译时类型。使用它,您可以生成强类型查询。但是,由于您在编译时没有类型,因此您can仍然生成查询,但不会是强类型的。
您可以使用非泛型重载生成未知编译时类型的 lambda 表达式。同样与CreateQuery()
method.
这是同一查询的两个版本,用于检查某些属性值是否与给定值匹配。一种是通用的,另一种则不是。
通用版本隐式地从查询的类型中获取类型。
public IQueryable<TSource> PropertyEqualsValue<TSource>(IQueryable<TSource> query,
string propertyName, object value)
{
var param = Expression.Parameter(typeof(TSource));
var body = Expression.Equal(
Expression.Property(param, propertyName),
Expression.Constant(value)
);
var expr = Expression.Call(
typeof(Queryable),
"Where",
new[] { typeof(TSource) },
query.Expression,
Expression.Lambda<Func<TSource, bool>>(body, param)
);
return query.Provider.CreateQuery<TSource>(expr);
}
var query = PropertyEqualsValue(SomeTable, "SomeColumn", "SomeValue");
而另一个类型取自提供的typeName
。请注意,创建查询时,我们无法提供类型,因为我们在编译时不知道类型是什么。
public IQueryable PropertyEqualsValue(IQueryable query,
Type type, string propertyName, object value)
{
var param = Expression.Parameter(type);
var body = Expression.Equal(
Expression.Property(param, propertyName),
Expression.Constant(value)
);
var expr = Expression.Call(
typeof(Queryable),
"Where",
new[] { type },
query.Expression,
Expression.Lambda(body, param)
);
return query.Provider.CreateQuery(expr);
}
var type = Type.GetType("Some.Type.Name");
var query = PropertyEqualsValue(SomeTable, type, "SomeColumn", "SomeValue");