我想实施
Expression<Func<int, int, int>> Max = (p1,p2) => p1 > p2 ? p1:p2;
Run Code Online (Sandbox Code Playgroud)
作为表达树并尝试过
ParameterExpression LeftEx = Expression.Parameter(typeof(int), "p1");
ParameterExpression RightEx = Expression.Parameter(typeof(int), "p2");
BinaryExpression GroesserAls = Expression.GreaterThan(LeftEx, RightEx);
ConditionalExpression Cond = BinaryExpression.Condition(GroesserAls, LeftEx, RightEx);
Expression main = Cond.Test;
Expression<Func<int, int, bool>> Lam = Expression.Lambda<Func<int, int, bool>>(main,
new ParameterExpression[] { LeftEx, RightEx });
Console.WriteLine(Lam.Compile().Invoke(333, 1200));
Run Code Online (Sandbox Code Playgroud)
使用Cond我要么得到真/假,而不是条件应该返回的LeftEx或RightEx.
我在文档中找不到任何内容.
彼得
我正在尝试创建一个扩展名"WhereNot"
所以我可以用:
Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)
Run Code Online (Sandbox Code Playgroud)
请注意,我的目标是学习linq表达式; 没解决我的问题.
我创造了这个功能:
<Extension()> _
Public Function WhereNot(Of TElement)(ByVal source As IQueryable(Of TElement), ByVal selector As Expression(Of Func(Of TElement, Boolean))) As IQueryable(Of TElement)
Return source.Where(GetWhereNotExpression(selector))
End Function
Run Code Online (Sandbox Code Playgroud)
我不知道如何切换布尔标志,函数Negate会这样做吗?
vb.net和C#的答案都很受欢迎
我在Haskell中了解如何处理以下内容时遇到一些问题:
假设我有类似这样的声明:
我想在树中表达这些语句并评估每个语句的结果,对于初学者我定义了以下数据结构:
data statement = Number Int
| Product statement statement
| Sum statement statement
deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
对于要使用的示例树,我使用了以下函数:
a :: statement
a = Product (Number 2) (Sum (Number 5) (Number 1))
Run Code Online (Sandbox Code Playgroud)
现在我想构建一个函数treeResult,它给出了我定义的语句的结果,但我不知道如何处理这个问题.为上述语句返回的整数应为12.
我的第一个猜测是编写一个函数,它将"statement"作为参数并返回一个int,仅对于简单语句的starters.
treeResult :: statement -> Int
treeResult (Number a) = a
treeResult (Product (Number a) (Number b)) = a*b
treeResult (Sum (Number a) (Number b)) = a+b
Run Code Online (Sandbox Code Playgroud)
现在我知道我需要一些可以递归的东西,但我不知道如何在haskell中编写它,有人可以帮助我吗?
我需要解析一个表达式来获取一个sql where子句.
.NET FX中是否有任何类或任何已具备此功能的第三方库?
我的意思是Linq2SQL,EntityFramework,所有这些都必须这样做,所以有人知道,如果有什么可以重复使用而不是重新发明轮子?
MyType.Where(Func<TEntity,bool>((entity)=>entity.Id == 5)))
Run Code Online (Sandbox Code Playgroud)
现在我需要获取表示where子句的相应字符串:
where abc.Id = "5"
Run Code Online (Sandbox Code Playgroud)
这只是一个简单的例子.它也应该与逻辑连词一起使用.
我知道我可以创建表达式树并自己解析它,但我认为可能存在已经存在的东西,我错过了
我正在.NET(4.0)上实现一个小型DSL,我目前正在使用Expression Trees将DSL转变为可执行代码块.
DSL是预定义的,因为我们正在实现对旧文件格式的支持.
Expression Trees是否适合这项工作?
我正在努力解决一些问题.我最初创建了一个通用层,它位于我的业务对象和工作正常的数据访问层之间.然后,我最近阅读了一些名为Expression Trees的内容,它显然更有效,并且已经证明是这样,因为我将Activator.CreateInstance()与表达式交换,并以指数方式改进了我的通用层.
我还在阅读有关整个区域(表达式)的一些内容,但我遇到了一些我想尝试制作通用的代码.目前,你必须传递一个具体的类型,如字符串,int,十进制等.我有点通用.我试了几件但失败了.我想要通用的位是Action,我不想传入一个字符串,我希望能够传递一般属性的类型,即typeof(T).GetProperty("Forename").PropertyType.这可能吗?正在考虑做一个有点foo bar的switch语句.
在此先感谢Onam.
public class TTT<T> where T : new()
{
public void Do(object t)
{
MethodInfo info = typeof(T).GetProperty("Forename").GetSetMethod();
ParameterExpression param = Expression.Parameter(typeof(string), "val");
MethodCallExpression call = Expression.Call(Expression.Constant(t), info,
new ParameterExpression[] { param });
Action<string> action = Expression.Lambda<Action<string>>(call, param).Compile();
action("hi");
}
}
Run Code Online (Sandbox Code Playgroud) 给定一个具有任意属性的简单类(讨论可以说是Id,Name和Description)
并且给定该类的实例,我想通过指定要匹配的属性来在数据库中找到匹配的条目
我试图在这方面做一些类似于EF的AddOrUpdate方法的事情,但我需要实体返回给我进行进一步处理.
var match = new SomeClass{Name="Whatever"};
var found = Context.SomeClass.Find(x=>x.Name, match);
public static T Find<T>(this DbSet<T> set, Expression<Func<T, object>> matchOn, T matchAgainst) where T : class {
var func = matchOn.Compile();
var valueToFind = func(matchAgainst);
var combinedExpression = //matchon + "=" + valueToFind;
var found = set.FirstOrDefault(combinedExpression);
return found;
}
Run Code Online (Sandbox Code Playgroud)
这给了我传入的对象中属性的值,但我现在需要将该值与传入的表达式组合并将其传递给数据库集.
IE浏览器,我试图有效运行的代码是 set.FirstOrDefault(x=>x.Name==valueToFind)如何把matchon表达式(包含x=>x.Name),并结合起来,与将==valueToFind得到x=>x.Name==valueToFind来自他们?
如何构建组合表达式?(我意识到上面的"字符串"代码是完全错误的,但我试图了解我需要该函数做什么,但我不知道那个语法会是什么样子.)
对于手动编码的示例,只需传入带有值集的硬编码lambda就足够了,但是我的用例包括遍历一组对象并找到每个对象的匹配,因此在运行时之前不会知道该值,并且该方法必须对任意类型和各种属性起作用,因此我也不能对属性名称进行硬编码.
我们可以写下面的代码:
Func<string, string> func = x => x + x;
Run Code Online (Sandbox Code Playgroud)
我们也可以写:
Expression<Func<string, string>> exp = x => x + x;
Run Code Online (Sandbox Code Playgroud)
但是当我写道:
Expression<Func<string, string>> exp = func;
Run Code Online (Sandbox Code Playgroud)
编译器抛出一个错误:
无法将类型'System.Func'隐式转换为'System.Linq.Expressions.Expression>'
所以我改变代码如下:
Expression<Func<string, string>> exp = (Expression<Func<string, string>>)func;
Run Code Online (Sandbox Code Playgroud)
和以前一样的错误.
那么什么是真正的类型x => x + x;,Expression和Delegate/Lambda Expression之间的关系是什么?
我正在尝试DataTable使用System.Linq.ExpressionsAPI 创建一个从对象列表创建的方法,但我无法弄清楚如何生成我在反编译表达式时得到的以下IL typeof (int).
IL_0000: nop
IL_0001: ldtoken System.Int32
IL_0006: call System.Type.GetTypeFromHandle
IL_000B: call LINQPad.Extensions.Dump<Object>
IL_0010: pop
IL_0011: ret
Run Code Online (Sandbox Code Playgroud)
目前我试图通过调用Type.GetType("System.Int")来解决问题,但我想生成代码,typeof (int)如果可能的话.
我正在尝试使用Expression此代码创建一个简单的映射器:
public static class MyUtility {
public static Action<TSource, TTarget> BuildMapAction<TSource, TTarget>(IEnumerable<PropertyMap> properties) {
var sourceInstance = Expression.Parameter(typeof(TSource), "source");
var targetInstance = Expression.Parameter(typeof(TTarget), "target");
var statements = BuildPropertyGettersSetters(sourceInstance, targetInstance, properties);
Expression blockExp = Expression.Block(new[] { sourceInstance, targetInstance }, statements);
if (blockExp.CanReduce)
blockExp = blockExp.ReduceAndCheck();
blockExp = blockExp.ReduceExtensions();
var lambda = Expression.Lambda<Action<TSource, TTarget>>(blockExp, sourceInstance, targetInstance);
return lambda.Compile();
}
private static IEnumerable<Expression> BuildPropertyGettersSetters(
ParameterExpression sourceInstance,
ParameterExpression targetInstance,
IEnumerable<PropertyMap> properties) {
var statements = new List<Expression>();
foreach (var property in properties) …Run Code Online (Sandbox Code Playgroud)