将查询语法转换为扩展方法语法
本文关键字:语法 扩展 方法 转换 查询 | 更新日期: 2023-09-27 18:00:41
我正在尝试使用AdventureWorks2012数据库和EF在我的演示应用程序中保持一致,但我需要一些帮助将这个Linq语句转换为扩展方法。
return (from person in this.context.Persons
from email in this.context.EmailAddresses
where email.EmailAddress == emailAddress
select person).FirstOrDefault();
对象是:
public class Person
{
public int BusinessEntityId { get; set; }
public string PersonType {get;set;}
public bool NameStyle { get; set; }
public string Title { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string Suffix { get; set; }
public int EmailPromotion { get; set; }
public PersonPassword Password { get; set; }
public virtual ICollection<PersonEmailAddress> EmailAddresses { get; set; }
}
public class PersonEmailAddress
{
public int BusinessEntityId { get; set; }
public int EmailAddressId { get; set; }
public string EmailAddress { get; set; }
public virtual Person Person { get; set; }
}
public class PersonPassword
{
public int BusinessEntityId { get; set; }
public string PasswordHash { get; set; }
public string PasswordSalt { get; set; }
public virtual Person Person { get; set; }
}
其中BusinessEntityId是PK。非常感谢您的帮助。谢谢
下面我将准确回答您的问题。然而,我真的不明白你为什么要把你的查询翻译成扩展方法,所以我认为这个答案不是你想要的答案。如果是的话,你能深入研究术语并重新表述这个问题吗
首先:LINQ查询语法只是扩展方法的一个很好的语法糖。您的代码:
return (from person in this.context.Persons
from email in this.context.EmailAddresses
where email.EmailAddress == emailAddress
select person).FirstOrDefault();
以下是转换为扩展方法的LINQ查询语法。两者是等效的,它们做的完全相同,给出的结果也相同:
return this.context.Persons
.SelectMany(p => this.context.EmailAddresses,
(p, e) => new { Person = p, Email = e})
.Where(pe => pe.Email == pe.Person)
.Select(pe => pe.Person)
.FirstOrDefault();
它只是读起来不那么好看,而且更难理解。