2011-06-05 71 views
1

我有3個實體:RatedPrice,DailyPrice和UtilizePrice。
每個實體都有代碼成員。爲實現相同接口的三個不同實體制作聯盟

我想寫一個lambda查詢,返回三個按代碼成員排序的IQueryable。我知道我需要在Union的某個地方使用,但我不知道如何。此外,所有3個實體都有差異,但實現IPrice。

我該如何做查詢?

+0

已使用EF將您的類映射爲層次結構?那麼英孚將照顧加入 – Eranga 2011-06-05 13:30:34

+0

@Eranga:我如何映射它們? – Naor 2011-06-05 13:40:45

+0

檢查這篇文章http://prashantbrall.wordpress.com/2011/04/06/ef-code-first-table-per-type/ – Eranga 2011-06-05 13:48:30

回答

0

您必須使用這樣的事情:

var data = ctx.RatedPrices.Select(p => new { p.Code, p.Price }) 
       .Concat(ctx.DailyPrices.Select(p => new { p.Code, p.Price }) 
         .Contact(ctx.UtilizePrices.Select(p => new { p.Code, p.Price })) 
       .OrderBy(p => p.Code); 

實體框架和LINQ到實體不知道什麼是接口。你必須使用投影到一些沒有映射的類型(在這個例子中是匿名的)並處理結果。由於您不使用某個基地的實體繼承Price(否則您不需要這樣),因此您不能指望EF會在單個結果集中返回RetedPrice,DailyPriceUtilizePrice的實例。

0

像這樣的事情也許

var list = listRatedPrice.Cast<IPrice>() 
.Concat(listDailyPrice.Cast<IPrice>() 
.Concat(listUtilizePrice.Cast<IPrice>))).Orderby(p => p.Code); 
+0

它是否返回IQueryable?我不能讓concat在.Net上,因爲每種類型都有很多元素。 – Naor 2011-06-05 12:24:40

+0

好吧,我不這麼認爲,在SQL中沒有接口的概念。你將不得不從每個表中選擇你想要的列(比如Name,price,Code ...),而不是連接它們。 – Magnus 2011-06-05 12:27:07

+0

另外,如果你打算在排序後得到所有的代碼,如果你在代碼或SQL服務器中進行了排序,那麼它就無關緊要了。 – Magnus 2011-06-05 12:29:01

相關問題