2015-05-04 169 views
0

我有兩個表是這樣的:實體框架內加入

客戶:

  • 電子郵件
  • 用戶名

產品:

  • 用戶名
  • 產品

我想用用戶名,產品和電子郵件填寫一個類。

這是我有這麼

var res = from H in db.Products 
      join C in db.customers on H.Username equals C.Username 
      where C.Username == H.Username 
      select H; 

Results results = res.Single(); 

然而,美中不足的是,我不知道究竟是如何工作的,任何人都可以打破它給我嗎?

+0

什麼是你不確定的? .Single()或查詢本身會給你什麼結果,...? – Thomas

+0

如果您不確定內聯接的語法,那麼作爲其內連接,它將只給出H和C中值都相同的結果(如果連接已具有適當的值,則不應該這樣做)。 ://stackoverflow.com/questions/37324/what-is-the-syntax-for-an-inner-join-in-linq-to-sql – Thomas

+0

@Thomas我想知道我會回到什麼樣的價值......例如,這將使用用戶名電子郵件和產品填充結果類嗎? –

回答

0
var res = from H in db.Products 
         join C in db.customers on H.Username equals C.Username 
         where C.Username == H.Username 
         select H; 

      Results results = res.Single(); 

上面的代碼使得C和H之間的內聯接(where子句是不必要的),並導致所有元素還給其中一個適當地連接產品和客戶的條目存在。

選擇H「just」從產品中返回所有數據。正如你所說你想要一個混音你需要做不同的事情。

我自己會使用匿名類型(或dto對象)。 對於匿名類型:

select new { Username = H.Username, Product = H.Product, EMail = C.EMail} 

放在一起:

var res = from H in db.Products 
         join C in db.customers on H.Username equals C.Username 
         where C.Username == H.Username 
         select new { Username = H.Username, Product = H.Product, EMail = C.EMail} 

      Results results = res.Single(); 

對於DTO(數據傳輸對象),您將創建與公共設置一個類/獲取屬性,並使用選擇新MyClass的(){ ....}而不是選擇新的{}。

的DTO是重用方面更好,你有錯寫的名字,你使用較少的問題,....


只需簡單地使用選擇H,C可悲的是不能工作因爲Linq想要每行僅返回單個對象(並且總是具有相同的數據類型)。因此,您需要在要返回的對象周圍放置容器。在這種情況下,無論是匿名類型還是DTO。

+0

當然,容器可以像'new {Product = H,Customer = C}'一樣簡單,很容易處理。 – Luaan