如何使用lambda表达式创建匿名类型?

时间:2011-09-12 10:24:15

标签: c# entity-framework lambda entity-framework-4.1

有人可以告诉我如何使用lambda表达式创建以下匿名类型吗?

p => new { p.Property1, p.Property2}

我真的陷入了困境,没有找到解决方案的地方。 我已经尝试了很多方法,但仍然无法动态生成上述表达式。 我的意图是使用它来将唯一键映射到我的POCO。 任何帮助都会真正有用。

2 个答案:

答案 0 :(得分:5)

这就是你想要的吗?

class Foo {
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

Func<Foo, object> lambda = foo => new { foo.Property1, foo.Property 2 };

var foo = new Foo { Property1 = "foo", Property2 = "bar" };
var anon = lambda(foo);

如果是这样,特别是因为你在谈论实体,我建议你:

  1. 使用Tuple代替匿名类型。元组也是不可变的,当你想将它们用作字典键时,这是一个加分。
  2. 在您的实体类中集成唯一键创建功能,而不是将其旋转到外部函数(匿名与否)。这是你的实体应该知道它的哪个属性构成一个唯一的密钥,而不是一些外部代码。
  3. 例如:

    class Foo {
        public string Property1 { get; set; }
        public string Property2 { get; set; }
    
        public object GetUniqueKey()
        {
            return Tuple.Create(this.Property1, this.Property2);
        }
    }
    

    上面的代码仍然存在问题:Property1Property2是可公开设置的,这意味着在将Foo个实例放入地图后,如果将其值与其值相匹配,则例如Property1稍后会被修改。然而,这是一个在实践中经常发生的问题,除了“只是不要弄乱对象属性”之外,确实没有其他解决方案。

答案 1 :(得分:0)

    Func<object> ano1 = () => new { Property1 = 1, Property2 = 2 };
    Expression<Func<object>> ano2 = () => new { Property1 = 1, Property2 = 2 };