0

我正在尝试使用 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。任何帮助是极大的赞赏。谢谢...

4

1 回答 1

3

下面我将准确回答你的问题。但是,我真的不明白您为什么要将查询转换为扩展方法,所以我认为这个答案不是您正在寻找的答案。如果是这样,您能否深入研究术语并重新提出问题?


第一: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();

它只是不那么好阅读,而且更难理解。

于 2013-02-22T00:48:33.680 回答