我已经google了很多东西来理解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”?
答案 0 :(得分:3)
x => x
是
的简写x => {
return x;
}
这是一个将x作为参数并返回x的函数,而
x => x.Id
是
的简写x => {
return x.Id;
}
这基本上意味着AddOrUpdate
函数需要知道如何获取它正在添加或更新的实体的Id,你可以将lambda视为一种定义函数的紧凑方式,在大多数情况下你可以实际定义功能:
int GetAuthorId(Author x) {
return x.Id;
}
并使用该函数代替lambda:
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函数内部,只要想要查找作者ID,它就会运行GetAuthorId并将作为参数传递给参数
- 编辑 -
正如评论中正确指出的那样,我刚才所说的Func<>
是正确的,但对于Expression<Func<>>
则不然,你可以阅读一些关于差异的here
答案 1 :(得分:1)
简单地说,因为该方法期望接收表示Authors
的语义键的表达式。
这样想 - 如果你传入x => x
,你会尝试执行以下操作:
Author
个对象。 当你传递x => x.Id
时,你会说:
要了解原因,可能会帮助您注意该方法需要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);
}
答案 2 :(得分:0)
Why it is not "x=>x"
因为函数有时需要唯一地标识每个对象。在这种情况下,对象的 ID 。
如果ID存在,则执行更新。如果ID不存在,则执行插入。