2013-02-22 79 views
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。 任何帮助,不胜感激。谢谢...

回答

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(); 

它只是没有很好的阅读,这是很难理解的。

+0

*阅读起来不太好,而且很难理解。*我相反。 – 2013-02-22 01:49:44

相关问题