在LINQ group by之后返回原始数据类型

时间:2012-09-04 14:35:10

标签: asp.net-mvc asp.net-mvc-3 linq entity-framework linq-to-entities

我需要我的LINQ查询在分组后返回Product Datatype。它似乎被包含在一个匿名的假家庭中。

我在Product中有一些我不关心的属性,只需要p.ID和p.Name等。

我现在得到的错误是:

The entity or complex type 'DatabaseModel.Product' cannot be constructed in a LINQ to Entities query.

这是我的方法:

        public static List<Product> GetSellableSpecialOffers(DatabaseEntities db)
    {

        var query = from p in db.Products
                    where (p.Visible == true && p.Active == true)
                    && p.ShowInSpecialOffers == true
                    group p by p.FamilyID == null ? 0 : p.FamilyID into f
                    select new Product {
                    ID = f.First().ID,
                    Name = f.First().Name,
                    Cost = f.First().Cost,
                    RRP = f.First().RRP
                    };

        return query.ToList();
    }

有什么问题?这有更好的方法吗? SQL总是返回1条记录而不是将对象包含在辅助数据类型中,我不明白。

非常感谢,

编辑1:

我对扩展规范表示歉意,但我需要以编程方式生成返回的产品,例如

select new Product {
                    ID = f.First().ID,
                    Name = f.First().Name,
                    Cost = f.OrderBy(p => p.NowCost).FirstOrDefault(),
                    RRP = f.First().RRP
                    }

如果我可以强烈输入家庭类:

    public partial class ProductFamily
{
    public Product GroupedProduct 
    {
        get
        {
            return this.Products.OrderBy(p => p.NowCost).FirstOrDefault();
        }
    }
}

然后我会这样做:

 var query = (from p in db.Products
                    where (p.Visible == true && p.Active == true)
                    && p.ShowInSpecialOffers == true
                    group p by p.ProductFamily == null ? null : p.ProductFamily into f
                     select f.GroupedProduct).ToList<Product>();

但我无法使用任何解决方案来处理我的工作。

3 个答案:

答案 0 :(得分:1)

你可以尝试(无聊,但不确定你有选择)

var query = from p in db.Products
                    where (p.Visible == true && p.Active == true)
                    && p.ShowInSpecialOffers == true
                    group p by p.FamilyID == null ? 0 : p.FamilyID into f
                    select new {
                    ID = f.First().ID,
                    Name = f.First().Name,
                    Cost = f.OrderBy(m => m.NowCost).First().Cost,
                    RRP = f.First().RRP
                    };

return query.ToList().Select(m => 
new Product {
    ID = m.ID,
    Name = m.Name, 
    Cost = m.Cost,
    RRP = m.RRP
};

修改 或者像Master Skeet所指出的那样(与你尝试过的完全一样,但更容易)

var query = from p in db.Products
                    where (p.Visible == true && p.Active == true)
                    && p.ShowInSpecialOffers == true
                    group p by p.FamilyID == null ? 0 : p.FamilyID into f
                    select f.OrderBy(m => m.NowCost).First();

答案 1 :(得分:1)

您可以简单地select f.First()并返回结果数据,如下所示:

var query = from p in db.Products
            where (p.Visible == true && p.Active == true)
            && p.ShowInSpecialOffers == true
            group p by p.FamilyID == null ? 0 : p.FamilyID into f
            select f.First();

然后在方法之外使用你需要的任何属性,忽略你不关心的东西(你处理Product对象,属性应该在那里即使你不需要它们。)

答案 2 :(得分:0)

中删除“产品”一词
select new Product{}

'select new'本身将创建一个匿名类型,而您将其指定为产品。