这是我的linq to sql查询,它运行正常但是当我转换并返回数据时,我得到了转换错误。
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 :(得分:2)
您正在使用select new
选择一个匿名对象,之后您尝试将一组匿名对象强制转换为IEnumerable<ProductImageModel>
,这将失败。
您有两种方法可以解决这个问题。
如果你的班级ProductImageModel
不是通过实体框架生成的,那么你可以在你的选择语句中使用它,如:
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)
执行select new { ... }
时,您将创建匿名对象。从本质上讲,你最终得到IQueryable<object>
并且与IEnumerable<ProductImageModel>
是逆向的(即,编译器不能从一个转换为另一个)。最简单的解决方案是选择实际的ProductImageModel
s,如果这就是您要使用的内容:
select new ProductImageModel
{
...
}
然后,不需要施法。