Tag: expression trees

如何使用Expression构建匿名类型?

在C#3.0中,您可以使用Expression创建具有以下语法的类: var exp = Expression.New(typeof(MyClass)); var lambda = LambdaExpression.Lambda(exp); object myObj = lambda.Compile().DynamicInvoke(); 但是如何使用Expression创建Anonymous类? //anonymousType = typeof(new{ Name=”abc”, Num=123}); Type anonymousType = Expression.NewAnonymousType??? <–How to do ? var exp = Expression.New(anonymousType); var lambda = LambdaExpression.Lambda(exp); object myObj = lambda.Compile().DynamicInvoke();

如何在执行之前将Entity Framework包装起来拦截LINQ表达式?

我想在执行之前重写LINQ表达式的某些部分。 而且我在将重写器注入正确的位置时遇到了问题(实际上完全没有)。 查看entity framework源(在reflection器中)它最终归结为IQueryProvider.Execute ,它在EF中通过ObjectContext耦合到表达式,提供internal IQueryProvider Provider { get; } 属性。 所以我创建了一个包装类(实现IQueryProvider )来在调用Execute时执行Expression重写,然后将其传递给原始的Provider。 问题是, Provider背后的字段是private ObjectQueryProvider _queryProvider; 。 这个ObjectQueryProvider是一个内部密封类 ,这意味着不可能创建一个提供添加重写的子类。 因此,由于非常紧密耦合的ObjectContext,这种方法让我陷入了死胡同。 如何解决这个问题呢? 我看错了方向吗? 有没有办法让自己注入这个ObjectQueryProvider ? 更新 :虽然提供的解决方案在您使用存储库模式“包装”ObjectContext时都能正常工作,但是允许从ObjectContext直接使用生成的子类的解决方案将更可取。 因此保持与Dynamic Data脚手架兼容。

通用DbDataReader到List 映射

我的属性绑定数据访问类有一个小问题(更像是烦恼)。 问题是当读取器中没有列中的相应属性时映射失败。 码 这是mapper类: // Map our datareader object to a strongly typed list private static IList Map(DbDataReader dr) where T : new() { try { // initialize our returnable list List list = new List(); // fire up the lamda mapping var converter = new Converter(); while (dr.Read()) { // read in each row, […]

按字符串生成EF orderby Expression

我想通过字符串参数生成表达式,一些代码如: private Expression<Func> Generate(string orderby) { switch (orderby) { case “Time”: return t => t.Time; case “Money”: return t => t.RewardMoney; default: return t => t.Id; } } 然后叫它: _context.Items.OrderBy(Generate(“Money”)); 但它无法编译! 我将T改为对象。 private Expression<Func> Generate(string orderby) 然后它可以编译,但它不起作用。 System.NotSupportedException:无法将类型“System.Int32”强制转换为“System.Object”类型。 LINQ to Entities仅支持转换EDM原语或枚举类型。

替换lambda表达式中的参数

考虑这段代码: public class Foo { public int a { get; set; } public int b { get; set; } } private void Test() { List foos = new List(); foos.Add(new Foo()); foos.Add(new Foo()); Expression<Func> exp0 = f => fa * fb; Expression<Func> exp1 = () => foos[0].a * foos[0].b; Expression<Func> exp2 = () => foos[1].a […]