2015-12-05 123 views
-3

我已经搜索了很多以了解c#中的lambda表达式。虽然人们提供了一些信息,但我不明白它是什么。任何人都可以用下面的代码解释我。这段代码可以给我理解,因为它是“我的”上下文。了解C#Lambda表达式

context.Authors.AddOrUpdate(x => x.Id, 
    new Author() { Id = 1, Name = "Jane Austen" }, 
    new Author() { Id = 2, Name = "Charles Dickens" }, 
    new Author() { Id = 3, Name = "Miguel de Cervantes" } 
    ); 

为什么它不是“x => x”?

+1

您是否阅读过此方法的[documentation](https://msdn.microsoft.com/en-us/library/hh846514(v = vs.103).aspx)? – DavidG

+0

...以及[Lambda表达式](https://msdn.microsoft.com/en-us/library/bb397687.aspx)上的文档。 – sstan

+1

我想说这是一种非常容易理解Lambda表达式的方法,也需要对表达式的理解。我建议看看LINQ – William

回答

3
x => x 

x => { 
    return x; 
} 

的速记其是带有x作为参数,并返回x的函数,而

x => x.Id 

x => { 
    return x.Id; 
} 
的速记

这基本上意味着AddOrUpdate功能需要知道如何得到它的添加或更新,你能想到的lambda表达式作为定义功能的紧凑方式的实体的ID,在大多数情况下,你实际上可以定义一个函数:

int GetAuthorId(Author x) { 
    return x.Id; 
} 

和使用在地方拉姆达的功能:

context.Authors.AddOrUpdate(GetAuthorId, 
    new Author() { Id = 1, Name = "Jane Austen" }, 
    new Author() { Id = 2, Name = "Charles Dickens" }, 
    new Author() { Id = 3, Name = "Miguel de Cervantes" } 
); 

里面的AddOrUpdate功能,它将运行GetAuthorId传递一个作者被触发后,想找到一个作者的ID

- 编辑 -

参数

的意见,作为正确地指出了我刚才说的是Func<>真实的,但不是真实Expression<Func<>>你可以阅读一些关于差别here

+2

OP可能指的是[IDbSetExtensions.AddOrUpdate](https://msdn.microsoft.com/en-us/library/hh846514(v = vs.103).aspx)。如果是这样,第一个参数是一个表达式,而不是委托,在这种情况下,lambda表达式不能被函数替代。 – sstan

1

简单地说,这是因为该方法期望接收的该表达式代表Authors的语义关键字。

认为它这样的 - 如果你在x => x过去了,你会试图进行以下操作:

  1. 基于由对象作者指定的键
  2. 添加或更新给定Author对象。

,当你在x => x.Id通过反之,你说:

  1. 基于由对象指定的键Author.Id
  2. 添加或更新作者给出的对象。

要理解为什么,它可能会帮助您注意该方法需要一个Expression<Func<TEntity,Object>>。这个参数类型通常用于对任意属性执行操作,如AddOrUpdate正在这里执行。

下面是一个方法的示例,它将采用表达式并打印出属性的成员名称。这里有更多的权力,但这应该至少有助于解释为什么AddOrUpdate()采取它所做的参数。

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

static void Example<T>(Expression<Func<T, object>> identifierExpression) 
{ 
    MemberExpression prop = identifierExpression.Body as MemberExpression; 
    Console.WriteLine(prop.Member); 
} 

static void Main(string[] args) 
{ 
    var person = new Person { FirstName = "jd", LastName = "phenix" }; 
    Example<Person>(x => x.FirstName); 
} 
0
Why it is not "x=>x" 

因为函数要一段时间来唯一地标识每个对象。在这种情况下,对象的ID

如果ID存在,则执行更新。如果ID不存在,则执行插入。