有一种名为Product的实体类型是由实体框架生成的。
我写了这个问题
public IQueryable<Product> GetProducts(int categoryID)
{
return from p in db.Products
where p.CategoryID== categoryID
select new Product { Name = p.Name};
}
下面的代码抛出以下错误:
实体或复杂类型的Shop。产品不能构造在
LINQ到实体查询"
var products = productRepository.GetProducts(1).Tolist();
但是当我使用select p而不是select new Product {Name = p.Name};它工作正常。
如何执行自定义选择节?
这里有一种不声明额外类的方法:
public List<Product> GetProducts(int categoryID)
{
var query = from p in db.Products
where p.CategoryID == categoryID
select new { Name = p.Name };
var products = query.ToList().Select(r => new Product
{
Name = r.Name;
}).ToList();
return products;
}
但是,只有当您想将多个实体组合到一个实体中时,才可以使用这种方法。上面的功能(简单的产品到产品映射)是这样完成的:
public List<Product> GetProducts(int categoryID)
{
var query = from p in db.Products
where p.CategoryID == categoryID
select p;
var products = query.ToList();
return products;
}
为了回应另一个被标记为重复的问题(见这里),我根据Soren的答案想出了一个快速而简单的解决方案:
data.Tasks.AddRange(
data.Task.AsEnumerable().Select(t => new Task{
creator_id = t.ID,
start_date = t.Incident.DateOpened,
end_date = t.Incident.DateCLosed,
product_code = t.Incident.ProductCode
// so on...
})
);
data.SaveChanges();
注意:
这个解决方案只适用于Task类上有一个导航属性(外键)(这里称为“Incident”)。
如果你没有,你可以使用“AsQueryable()”其他发布的解决方案之一。