2012-11-14 126 views
1

我有兩個表格(客戶端和電子郵件),其中一個包含客戶數據,包括主電子郵件地址,另一個包含其他電子郵件地址。加入並與實體框架聯盟

我需要從其許多電子郵件地址之一驗證用戶,無論它是在客戶端還是電子郵件表中。我想出了這個SQL語句,它工作得很好:

set @email = '[email protected]'; 
select c1.credits > 0 as Allowed, c1.Email as MainEmail from 
customers c1 inner join (select ClientId, Email FROM customers WHERE 
[email protected] union all select ClientId, Email FROM emails WHERE [email protected]) e1 
on c1.ClientId = e1.ClientId; 

如何使用基於方法的語法將此查詢寫入實體?

+0

它必須是方法語法或表達式語法也可以嗎? –

+0

我更喜歡方法的語法,但我可以使用表達式語法作爲替代。 – JPG

回答

1

如果我理解正確,

客戶可能會或可能不會有電子郵件(附加)在emails表。 此外,客戶在emails表中還有一個以上的額外電子郵件條目。像下面

List<Customer> customers = new List<Customer> 
{ 
    new Customer { ClientId = 1, Email = "[email protected]", Credits = 2 }, 
    new Customer { ClientId = 2, Email = "[email protected]", Credits = 1 }, 
    new Customer { ClientId = 3, Email = "[email protected]", Credits = 1 }, 
}; 

List<Emails> emails = new List<Emails> 
{ 
    new Emails { ClientId = 1, Email = "[email protected]" }, 
    new Emails { ClientId = 1, Email = "[email protected]" }, 
    new Emails { ClientId = 2, Email = "[email protected]" }, 
}; 

在這種情況下,使用下面的查詢來完成它,

var result = from c in customers 
      let _emails = emails.Where(e => c.ClientId == e.ClientId).Select(t => t.Email) 
      where c.Email == "[email protected]" || _emails.Contains("[email protected]") 
      select new 
      { 
       Allowed = c.Credits > 0, 
       MainEmail = c.Email 
      }; 

我希望它可以幫助你。

+0

我會根據您的示例工作,因爲我的真實表格更復雜。希望明天我會給你一個更新。謝謝! – JPG

+0

我收到此錯誤:LINQ to Entities無法識別方法'System.String加入(System.String,System.Collections.Generic.IEnumerable'1 [System.String])''方法,並且此方法無法轉換爲商店表達。 – JPG

+0

@JPG,很好。我編輯我的帖子也看到這個.. http://stackoverflow.com/questions/4095658/how-do-i-concatenate-strings-in-entity-framework-query –