0

分组后,我需要我的 LINQ 查询返回产品数据类型。它似乎被包裹在一个匿名的伪家庭中。

我在 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>();

但是我无法使用我所拥有的解决方案。

4

3 回答 3

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();
于 2012-09-04T14:39:59.080 回答
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对象,即使您不需要属性也应该在那里)。

于 2012-09-04T14:49:44.373 回答
0

删除“产品”一词

select new Product{}

“选择新”本身将创建一个匿名类型,而您将其指定为产品。

于 2012-09-04T14:38:32.157 回答