2014-07-24 27 views
2

這是我的LINQ到SQL查詢哪些工作正常,但是當我投擲並返回數據時,我得到了投射錯誤。任何一個可以幫助鑄造下面的linq查詢?

var productImages = from prod in context.seller_productinventory.AsEnumerable() 
            join prodImage in context.seller_productimages on prod.prdid equals prodImage.prdid 
            join category in context.mstr_scategory on prod.mcid equals category.CategoryID 
            join subcategory in context.mstr_scategory on prod.scid equals subcategory.CategoryID 
            select new 
            { 
             ProductId = prod.prdid, 
             Category = category.CategoryName, 
             Subcategory = subcategory.CategoryName, 
             Image1 = prodImage.image1Path, 
             Image2 = prodImage.image2Path, 
             Image3 = prodImage.image3Path, 
             Image4 = prodImage.image4Path, 
             ProductStatusCd = (Convert.ToInt32(prod.isAdminApproved) != 1) ? "Pending Approval" : "Approved" 
            }; 

我在下面的代碼中得到錯誤。

return (IEnumerable<ProductImageModel>) productImages.ToList(); 

我的模型類:

public class ProductImageModel 
    { 
     public int ProductId { get; set; } 
     public string Category { get; set; } 
     public string Subcategory { get; set; } 
     public string Image1 { get; set; } 
     public string Image2 { get; set; } 
     public string Image3 { get; set; } 
     public string Image4 { get; set; } 
     public string ProductStatusCd { get; set; } 
    } 
+0

那麼錯誤是什麼? – Dbloch

+2

這是因爲您選擇了「匿名」類型。 – gleng

回答

2

您正在使用select new選擇一個匿名對象,後來你想投的匿名對象的集合IEnumerable<ProductImageModel>,這將失敗。

你有兩個選擇來解決這個問題。

如果您ProductImageModel類是不通過實體框架生成的,那麼你可以使用你喜歡的SELECT語句:

select new ProductImageModel 
{ 
//.... fields 
} 

還是另一種選擇是創建一個臨時的模板類和項目的領域是類對象。

記住,如果ProductImageModel是框架生成的,那麼你不能在使用select的列投影中使用它。

從您的代碼看來,您的類ProductImageModel實際上代表了數據庫中的表。您將需要具有select子句中指定字段的另一個班級(DTO)。

public class ProductImageModelDTO 
{ 
    //your fields 
} 

,然後在你的LINQ查詢:

select new ProductImageModelDTO 
    { 
     ProductId = prod.prdid, 
     //rest of the fields. 

在這種情況下,你的方法的返回類型應該是:

IEnumerable<ProductImageModelDTO> 
+1

很好地解釋了+1。 – JonH

+1

@Habib非常感謝你的解決方案。 –

+0

@三居饒,歡迎您。我相信如果它的工作如此迅速,它一定是選項1,所以你的類'ProductImageModel'不是通過框架生成的。 – Habib

1

當你做select new { ... },你要創建匿名對象。實質上,你最終得到IQueryable<object>,這與IEnumerable<ProductImageModel>是不相容的(即編譯器不能從一個轉換到另一個)。最簡單的辦法是選擇實際ProductImageModel■如果這就是你要使用什麼:

select new ProductImageModel 
{ 
    ... 
} 

,再沒有鑄造是必要的。

+0

我完全理解這個問題,但似乎感覺不好的做法是,你最終會說像一個實體框架/ linq2sql對象/類像產品。在這種情況下,你不能真正使用它,所以你必須創建另一個說產品類,而不是綁定到你實際上可以映射到的實體框架或linq2sql。這對其他人來說很正常嗎?所以你最終得到兩個特定於db模型的類,而另一個作爲Abstract Data Type讓你可以創建db模型對象。無論如何+1。 – JonH

+0

非常感謝你@chris pratt –

+0

@JonH:這不是你*不能*使用實體;它很少有意義。創建另一個類並將實體數據映射到其中,可以讓您自由地爲特定目的自定義該類。典型的用例是視圖模型,這些視圖模型是爲了使用特定視圖或視圖集而定製的類。擁有這些視圖模型後,您就可以擁有強類型的特定於視圖的數據,這些數據不適合您的數據庫實體,如選擇列表。 –