Tag: expression trees

使用Entity Framework 5在SQL Server中连接字符串和数字的最佳方法?

出于某种原因,微软决定不支持EF5中的简单连接。 例如 Select(foo => new { someProp = “hello” + foo.id + “/” + foo.bar } 如果foo.id或foo.bar是数字,这将抛出。 我发现的解决方法显然是代码: Select(foo => new { someProp = “hello” + SqlFunctions.StringConvert((double?)foo.id).Trim() + “/” + SqlFunctions.StringConvert((double?)foo.bar).Trim() } 哪个工作正常,但看起来很可怕。 那么,有更好的方法来实现这个更清洁的代码吗? 我对这个客户端不感兴趣,所以没有.AsEnumerable()请回答。

执行IQueryable查询的一部分并将其余部分推迟到Linq for Objects

我有一个Linq提供程序,它成功地从我选择的数据源获取数据,但是我现在想要做的是我有我的过滤结果集,允许Linq to Objects处理表达式树的其余部分(对于像Joins这样的东西,投影等) 我的想法是,我可以通过ExpressionVisitor将结果集IEnumerable替换为包含我的IQueryProvider的表达式常量,然后返回该新表达式。 还从我的IQueryable返回IEnumerable的提供程序…但这似乎不起作用:-( 有任何想法吗? 编辑:这里有一些很好的答案,但给出的forms…… var qry = from c in MyProv.Table() Join o in MyProv.Table() on c.OrderID equals o.ID select new { CustID = c.ID, OrderID = o.ID } 在我的提供者中,我可以轻松地从客户和订单中获取2个结果集,如果数据来自SQL源,我将构建并传递SQL Join语法,但是这种情况下数据不是来自SQL源,所以我需要在代码中进行连接…但正如我所说,我有2个结果集,而Linq to Objects可以进行连接……(以及后来的投影)只需替换表达式常量MyProv.Table和MyProv.Table with List和List ,让List提供程序处理表达式……这可能吗? 怎么样?

表达树生成的IL是否经过优化?

好吧,这只是好奇心,没有现实世界的帮助。 我知道使用表达式树,您可以像常规C#编译器一样动态生成MSIL。 由于编译器可以决定优化,我很想知道在Expression.Compile()期间生成的IL是什么情况。 基本上有两个问题: 因为在编译时编译器可以在调试模式和释放模式下产生不同的(可能是略微的)IL,在调试模式和发布模式下构建时通过编译表达式生成的IL是否存在差异? 此外,在运行时将IL转换为本机代码的JIT在调试模式和发布模式下都应该有很大的不同。 编译表达式也是如此吗? 或者来自表达树的IL根本没有被咬过? 我的理解可能有缺陷,请纠正我以防万一。 注意:我正在考虑分离调试器的情况。 我问的是Visual Studio中“debug”和“release”附带的默认配置设置。

linq中的动态排序

请考虑这种情况: 我有一个包含大约50个字段的类的列表。我想要一个用户可以根据字段列表进行排序的Combobox。例如,如果用户选择“F1”列表,则根据“F1”排序。 我不想为每个字段使用if-else排序。我看到这个主题: 在对数据集或对象列表进行数据绑定时对网格视图进行排序 但我无法使用它的答案。 我如何才能将Expression Tree用于此目的? 谢谢 编辑1) : 据亲爱的@Thom Smith回答,我写了这段代码: using (NorthwindModel1.NorthwindEntities2 ent = new NorthwindModel1.NorthwindEntities2()) { var query = from o in ent.Orders where o.OrderID < 10257 select o; query.OrderBy("CustomerID", SortDirection.Ascending); GridView1.DataSource = query; GridView1.DataBind(); } 但它没有排序。 如果我用这种方式编写代码: GridView1.DataSource = query.OrderBy(o=>o.CustomerID); 它是排序的。 问题出在哪儿?

C#在lambda表达式中切换

是否有可能在lambda表达式中进行切换? 如果没有,为什么? Resharper将其显示为错误。

构建LINQ表达式树:如何在范围内获取变量

我正在构建一个LINQ表达式树,但它不会编译,因为据称局部变量$var1超出了范围: 变量”类型’System.Object’从范围”引用,但它没有定义 这是表达式树: .Block() { $var1; .If ($n.Property1 == null) { .Block() { $var1 = null; .Return #Label1 { } } } .Else { .Default(System.Void) }; $var1 = (System.Object)($n.Property1).Length; .Label .LabelTarget #Label1:; $var1 } 以下代码负责构建树。 它是更大的东西的一部分,因此我不希望它的目的从这个例子中完全清楚。 MemberExpression sourceExpression = …; List expressions = new List(); LabelTarget returnTarget = Expression.Label(); ParameterExpression resultVariable = Expression.Variable(typeof(object)); expressions.Add(resultVariable); expressions.Add( […]

C#编译器错误? 用于Expression中的只写属性的对象初始化程序语法使csc崩溃

您可能会认为这是一个错误报告,但是我很好奇我是否在这里非常错误,或者是否有来自Eric或Microsoft的其他人的解释。 更新 现在,这是作为 Microsoft Connect上的错误发布的 。 描述 考虑以下课程: class A { public object B { set { } } } 这里, AB是一个只写但其他方面很好的属性。 现在,想象一下我们在表达式中分配它 : Expression<Func> expr = () => new A { B = new object { } }; 此代码使C#编译器( 3.5 .30729.4926和4.0 .30319.1)吐出 内部编译器错误(地址013E213F处的0xc0000005):可能的罪魁祸首是“BIND”。 和崩溃。 但是, 仅使用构造函数( ( ) )替换对象初始化程序语法( { } )就可以了 。 完整的复制代码: […]

将List.Contains转换为表达式树

相关: 使用3个条件创建Lambda表达式 转换包含到表达式树 在我上一个问题的下面,我遇到了这个查询,我想编写Expression Tree版本: List lst = new List{1,2}; from a in myTbl where a.Age = 20 && lst.Contains(a.Status) select a 我写这段代码: List lst = new List{1,2}; var param = Expression.Parameter(typeof(T), “o”); var body = Expression.AndAlso( Expression.Equal( Expression.PropertyOrField(param, “Age”), Expression.Constant(20) ), Expression.Call(Expression.PropertyOrField(param, “Status”), “Contains”, Type.EmptyTypes, Expression.Constant(lst))); var lambda = Expression.Lambda<Func>(body, param); return lambda; 我收到错误: […]

GROUP BY / Case Asp.Net Web API ODATA的不敏感扩展?

无法通过ODATA V4文档中的引用找到组。 当我们在URL中通过查询传递组时,它只返回键,而不是实际的分组结果。 在ODATA Web API的可扩展性点上,在Asp.Net ODATA中使用Group by的任何参考。 我们需要完全掌握如何解析ODATA查询并将其转换为LILNQ到实体查询。 我正在谈论拦截ODATA查询和执行手动定制的行,例如LINQ to Entities 我正在努力实现Case Sensitivity的类似扩展。 OData Case Web API中的In-Sensitive过滤?

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); 但对于我的扩展方法: public static class StringEx { public static bool Like(this string a, string b) { return a.ToLower().Contains(b.ToLower()); } } 不幸的是,下一个代码为参数“method”抛出了ArgumentNullException: var like = typeof(string).GetMethod(“Like”, new[] {typeof(string)}); comparer = Expression.Call(prop, like, value); 我做错了什么?