小编Cod*_*ted的帖子

Expression.Lambda和运行时的查询生成,最简单的"Where"示例

我试图在运行时生成一个简单的Lambda Expression而没有运气......这样的事情:

var result = queryableData.Where(item => item.Name == "Soap")
Run Code Online (Sandbox Code Playgroud)

这是我的示例类和fixture可查询:

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
}

IQueryable<Item> queryableData = ...;
Run Code Online (Sandbox Code Playgroud)

然后我在运行时生成一个lambda表达式,正确的代码如下:

//"item" in "item =>..."
var item = Expression
    .Parameter(typeof(Item), "item");

//property of my item, this is "item.Name"
var prop = Expression
    .Property(item, "Name");

//then "Soap" in '... => item.Name=="Soap"'
var value = Expression.Constant("Soap");

//equality expression "==" in my primer
var equals = Expression.Equal(prop, …
Run Code Online (Sandbox Code Playgroud)

.net c# lambda dynamic-language-runtime expression-trees

43
推荐指数
1
解决办法
2万
查看次数

Expression.Call在简单的lambda表达式中.可能吗?

我需要生成一个lambda表达式

item => item.Id > 5 && item.Name.StartsWith("Dish")
Run Code Online (Sandbox Code Playgroud)

好的,item.Id> 5很简单

var item = Expression.Parameter(typeof(Item), "item");

var propId = Expression.Property(item,"Id");
var valueId = Expression.Constant(5);
var idMoreThanFive = Expression.GreaterThan(propId, valueId);
Run Code Online (Sandbox Code Playgroud)

但第二部分对我来说更复杂......

var propName = Expression.Property(item,"Name");
var valueName = Expression.Constant("Dish");
Run Code Online (Sandbox Code Playgroud)

如何为propName调用StartsWith?

.net c# lambda expression-trees

12
推荐指数
1
解决办法
6357
查看次数

Lambda和Expression.Call用于扩展方法

我需要为这里的方法实现一个表达式:

var prop = Expression.Property(someItem, "Name"); 
var value = Expression.Constant(someConstant);

var contains = typeof(string).GetMethod("Contains", new[] {typeof(string)});
var expression = Expression.Call(prop, contains, value);
Run Code Online (Sandbox Code Playgroud)

但对于我的扩展方法:

public static class StringEx
{
    public static bool Like(this string a, string b)
    {
        return a.ToLower().Contains(b.ToLower());
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,下一个代码为参数"method"抛出了一个ArgumentNullException:

var like = typeof(string).GetMethod("Like", new[] {typeof(string)});
comparer = Expression.Call(prop, like, value);
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

.net c# lambda extension-methods expression-trees

8
推荐指数
3
解决办法
8199
查看次数

如何使用GetMethod进行静态扩展方法

我有一个扩展方法:

public static class StringEx
{
    public static bool Like(this string a, string b)
    {
        return a.ToLower().Contains(b.ToLower());
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用我的参数通过GetMethod正确反映它?我试过这个没有成功(静态方法有例外):

var like = typeof(StringEx).GetMethod("Like", new[] {typeof(string), typeof(string)});
comparer = Expression.Call(prop, like, value);
Run Code Online (Sandbox Code Playgroud)

.net reflection extension-methods static get-method

8
推荐指数
2
解决办法
4981
查看次数