使用 Linq to Entities (EF6) 动态 select 列名
Dynamically select column name using Linq to Entities (EF6)
我想封装使用 EF6 时的常见场景。
这是一个例子:
public class StringRequest : DbRequestProperty
{
public string Name { get; set; }
public bool? ExactMatch { get; set; }
protected override bool IsValid()
{
return !string.IsNullOrWhiteSpace(Name);
}
private bool RequestExactMatch()
{
return ExactMatch.HasValue && ExactMatch.Value;
}
protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
return RequestExactMatch()
? original.Where(o => GetProperty<string>(o, propertyName) == Name)
: original.Where(o => GetProperty<string>(o, propertyName).Contains(Name));
}
}
但 GetProperty 无法转换为查询。
所以我正在考虑使用 "propertyName".
动态选择列
protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
return RequestExactMatch()
? original.Where(o => GetColumnByName<string>(propertyName) == Name)
: original.Where(o => GetColumnByName<string>(propertyName).Contains(Name));
}
这可能吗?
提前致谢。
您可以像这样使用 Expression class 动态创建 Expression<Func<T, bool>>
:
protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
var parameter = Expression.Parameter(typeof(T));
var property = Expression.PropertyOrField(parameter, propertyName);
var constant = Expression.Constant(Name);
Expression predicate;
if(RequestExactMatch())
{
predicate = Expression.Equal(property, constant);
}
else
{
predicate = Expression.Call(property, "Contains", null, constant);
}
var lambda = Expression.Lambda<Func<T, bool>>(predicate, parameter);
return original.Where(lambda);
}
我想封装使用 EF6 时的常见场景。 这是一个例子:
public class StringRequest : DbRequestProperty
{
public string Name { get; set; }
public bool? ExactMatch { get; set; }
protected override bool IsValid()
{
return !string.IsNullOrWhiteSpace(Name);
}
private bool RequestExactMatch()
{
return ExactMatch.HasValue && ExactMatch.Value;
}
protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
return RequestExactMatch()
? original.Where(o => GetProperty<string>(o, propertyName) == Name)
: original.Where(o => GetProperty<string>(o, propertyName).Contains(Name));
}
}
但 GetProperty 无法转换为查询。 所以我正在考虑使用 "propertyName".
动态选择列 protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
return RequestExactMatch()
? original.Where(o => GetColumnByName<string>(propertyName) == Name)
: original.Where(o => GetColumnByName<string>(propertyName).Contains(Name));
}
这可能吗? 提前致谢。
您可以像这样使用 Expression class 动态创建 Expression<Func<T, bool>>
:
protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
var parameter = Expression.Parameter(typeof(T));
var property = Expression.PropertyOrField(parameter, propertyName);
var constant = Expression.Constant(Name);
Expression predicate;
if(RequestExactMatch())
{
predicate = Expression.Equal(property, constant);
}
else
{
predicate = Expression.Call(property, "Contains", null, constant);
}
var lambda = Expression.Lambda<Func<T, bool>>(predicate, parameter);
return original.Where(lambda);
}