2015-12-05 181 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不存在,則執行插入。