任何人都可以帮助在linq查询下面进行转换吗?

时间:2014-07-24 19:26:17

标签: c# linq entity-framework linq-to-sql

这是我的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; }
    }

2 个答案:

答案 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
{
    ...
}

然后,不需要施法。