我需要我的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>();
但我无法使用任何解决方案来处理我的工作。
答案 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'本身将创建一个匿名类型,而您将其指定为产品。