2014-07-24 30 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:这不是你*不能*使用实体;它很少有意义。创建另一个类并将实体数据映射到其中,可以让您自由地为特定目的自定义该类。典型的用例是视图模型,这些视图模型是为了使用特定视图或视图集而定制的类。拥有这些视图模型后,您就可以拥有强类型的特定于视图的数据,这些数据不适合您的数据库实体,如选择列表。 –