2010-03-31 51 views
2

我想寫一個linq查詢,將只返回從我的實體對象到列表對象的某些列。Linq - 如何查詢特定的列和返回列表

下面是我的代碼產生一個錯誤(不能匿名類型的泛型列表隱式轉換爲類型TBLPROMOTION的泛型列表):

IQueryable<TBLPROMOTION> matches = webStoreContext.TBLPROMOTION.Include("TBLSTORE").Include("LKPROMOTIONTYPE"); 

List<TBLPROMOTION> promotionInfo = null; 

promotionInfo = (from p in matches 
       orderby p.PROMOTION_NM descending 
       select new { p.EFFECTIVE_DT, p.EXPIRE_DT, p.IS_ACTIVE, 
       p.PROMOTION_DESC, p.PROMOTION_ID, p.PROMOTION_NM }).ToList(); 

什麼是做到這一點的最好辦法。我不想在這種情況下執行「select p」,並返回與查詢相關聯的所有列。

在此先感謝, 比利

+0

什麼是「火柴」?它是一個IEnumerable ? – Vin 2010-03-31 15:50:57

+0

對不起,添加了匹配位的問題。 – 2010-03-31 16:00:04

回答

5

你就不能var promotionInfo =()並獲得匿名類型的列表?

+0

最後,我不得不去與匿名類型。謝謝你的幫助。 – 2010-03-31 18:00:23

0

你嘗試

select new TBLPROMOTION {..... 

代替

select new {..... 
+0

這會產生一個語法錯誤,指出「無法使用集合初始值設定項初始化類型TBLPROMOTION,因爲它沒有實現IEnumerable類型」。 – 2010-03-31 15:57:26

0
List<TBLPROMOTION> promotionInfo = null; 

promotionInfo = (from p in matches 
       orderby p.PROMOTION_NM descending 
       select new TBLPROMOTION { COL1 = p.EFFECTIVE_DT, COL2 = p.EXPIRE_DT, COL3 = p.IS_ACTIVE... }).ToList(); 

其中COL1,COL2,......是性能上TBLPROMOTION你願意,你填寫的名稱。

+0

這將在L2E運行時失敗;您不能使用初始化程序實例化實體類型,只能使用POCO或匿名類型。 – 2010-03-31 15:46:55

+0

嘗試了這一點,並在運行時失敗,因爲克雷格剛剛聲明。 – 2010-03-31 15:53:20

+0

我以爲TBLPROMOTION是一個POCO,匹配包含實體類型。問題更新後,我發現情況並非如此。 – 2010-03-31 16:00:33

0

如果你想在表的一個子集,你有兩個選擇:

  • @Fredou提到選擇新TBLPROMOTION {...}

  • 另一種方法是創建一個自定義DTO其中有確切性質&選擇它們,而不是這樣的:

    名單promotionInfo = ... 選擇新TBLPROMOTION_DTO { Effective_dt = ... }

HTH

1

如果你從一個L2E查詢已定義的類型移動,您可能需要之間的一個步驟。我沒試過編譯這一點,但這樣的:


    List<TBLPROMOTION> promotions = new List<TBLPROMOTION>();

var results = from p in matches orderby p.PROMOTION_NM descending select new { p.EFFECTIVE_DT, p.EXPIRE_DT, p.IS_ACTIVE, p.PROMOTION_DESC, p.PROMOTION_ID, p.PROMOTION_NM };

foreach (var v in results) 
    { 
     promotions.Add(new TBLPROMOTION(v.EFFECTIVE_DT, v.EXPIRE_DT, v.IS_ACTIVE, 
     v.PROMOTION_DESC, v.PROMOTION_ID, v.PROMOTION_NM)); 
    } 

基於下面的評論,你可以嘗試這樣的:


    foreach(var v in results) 
    { 
     TBLPROMOTION temp = new TBLPROMOTION(); 
     temp.EFFECTIVE_DT = v.EFFECTIVE_DT; 
     temp.EXPIRE_DT = v.EXPIRE_DT; 
     temp.IS_ACTIVE = v.IS_ACTIVE 
     // Assign Other Properties

promotions.Add(temp); 
} 

....... 對不起:只需閱讀頂部的附加內容。

您確定沒有任何字段會被TBLPROMOTION對象忽略(而不是說「select p」)嗎?此外,感覺你的TBLPROMOTION對象將爲這些被跳過的字段賦予屬性(並因此分配內存),爲什麼不只是使用一個匿名類型或設置一個只包含你需要的屬性的助手類?

+0

對不起,這不適合我。我得到一個錯誤,指出TBLPROMOTION沒有一個構造函數需要6個參數。謝謝。 – 2010-03-31 17:40:24

+0

您是否嘗試先安裝對象? – AllenG 2010-03-31 17:45:00

+0

將採用匿名類型的解決方案。不得不給你所有幫助的標記,但另一個人早就給出了答案。只是希望我不必走那條路。謝謝你的幫助和時間。 – 2010-03-31 18:01:46

4

好的,基本上你不能將Anonymous類型轉換爲已知類型,如TBLPROMOTION。

ofcourse,你可以說var promotionInfo =,然後得到一個IEnumerable<{Anonymoustype}>並使用它來做什麼,你想要做什麼promotionInfo

另外,我個人比較喜歡流利版本LINQ查詢的,容易對眼睛,良好的編程減肥,至少對我來說:)

var promotionInfo = matches 
       .OrderByDescending(p => p.PROMOTION_NM) 
       .Select(p => new { p.EFFECTIVE_DT, 
           p.EXPIRE_DT, 
           p.IS_ACTIVE, 
           p.PROMOTION_DESC, 
           p.PROMOTION_ID, 
           p.PROMOTION_NM}) 
       .ToList(); 
+0

針對EF的'Fluent'也可以更快速地運行 – vittore 2010-03-31 16:18:25

+0

,並與匿名類型的解決方案一起使用。我給了你一個印記,因爲這確實幫助我指出了正確的方向。感謝您的時間。 – 2010-03-31 18:02:42

+0

當然,很高興我可以幫助... – Vin 2010-04-01 16:16:37

1

@Billy,下面的代碼爲我工作。

List<TBLPROMOTION> promotionInfo = 
         (from p in matches 
         orderby p.PROMOTION_NM descending 
         select new TBLPROMOTION(p.EFFECTIVE_DT, p.EXPIRE_DT, p.IS_ACTIVE, 
             p.PROMOTION_DESC, p.PROMOTION_ID, p.PROMOTION_NM) 
        ).ToList(); 
+0

雖然問題是舊的,但我發現它有幫助,所以想到爲其他用戶添加我的答案。使用構造函數的想法來自@ matt-dearing給出的答案 – 2014-01-07 06:28:06