我想通过向where子句提供字符串表达式,使用linq动态过滤数据。
例如:
string filterExpr = "it.City='London'"
var ret1 = Contex.Customers.Where(filterExpr);
我该如何做同样的事情,但这一次过滤以某些字符串开头的数据?
如果无法实现使用字符串,我该如何构建适当的Lambda表达式?
(对我来说,能够按许多参数(OR / AND)进行过滤非常重要)
答案 0 :(得分:2)
我认为您可能正在寻找的是Dynamic LINQ。 Scott Guthrie发布了这个:
它没有使用lambda语法那么快,因为它们需要在运行时编译,但它可能是你的答案。
答案 1 :(得分:1)
Public Shared Function getFilterStartsWith(Of T)(ByVal param As ParameterExpression, ByVal prop As MemberExpression, ByVal arg As Object) As Expression
Dim mi As MethodInfo = GetType(String).GetMethod("StartsWith", New Type() {GetType(String)}, Nothing)
Return Expression.Lambda(Of Func(Of T, Boolean))(LambdaExpression.[Call](prop, mi, Expression.Constant(arg, GetType(String))), param)
End Function
在C#中:
public static Expression getFilterStartsWith<T>(ParameterExpression param, MemberExpression prop, object arg) {
MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }, null);
return Expression.Lambda<Func<T, bool>>(LambdaExpression.Call(prop, mi, Expression.Constant(arg, typeof(string))), param);
}
这是我在最近写的solution中用于startsWith的函数。事实证明这是一个巨大的痛苦,因为你不能使用Type变量作为ctype中的参数或vb中的DirectCast,并且你不能对一个对象和相同类型的可空对象进行linq比较。
答案 2 :(得分:0)
请试试这个:
var ret1 = contex.Customers.Where(x => x.it.City.StartsWith('l'));
HTH
答案 3 :(得分:0)
忘记&#34;魔术&#34;字符串,C#意味着强类型。 这样或那样你最终会得到一个列表,所以最好的方法是强力键入它们。
public class Veg
{
public int Id { get; set; }
public string Name { get; set; }
public bool Fruit { get; set; }
}
enum Mode
{
One,
Two,
Three
}
static void Main()
{
Mode mode = Mode.One;
var data = new List<Veg>
{
new Veg{Id = 1, Name = "Apple", Fruit = true},
new Veg{Id = 2, Name = "Carrot", Fruit = false}
};
var dataSelect = data.Where(w => (mode == Mode.One && w.Fruit) || //only fruits
(mode == Mode.Two && !w.Fruit) || //only not fruits
(mode == Mode.Three)); //all of it
}