我正在使用带有C#的ASP.net MVC。为什么这是代码:
public IQueryable<Product> ListProducts(string prodcutType)
{
var results = from p in db.Products
join s in db.Stocks
on p.ID equals s.IDProduct
where p.ptype == prodcutType
select new { s.width, s.height, s.number};
return results;
}
显示以下错误?
错误1无法隐式转换类型
System.Linq.IQueryable<AnonymousType#1>
至System.Linq.IQueryable<eim.Models.Product>
。 存在显式转换(是你 错过演员?)
答案 0 :(得分:8)
因为select new { s.width, s.height, s.number}
表示System.Linq.IQueryable<AnonymousType#1>
,但您的函数希望返回IQueryable<Product>
。将您的代码更改为:
public IQueryable<Product> ListProducts(string prodcutType)
{
var results = from p in db.Products
join s in db.Stocks
on p.ID equals s.IDProduct
where p.ptype == prodcutType
select p;
return results;
}
<强>更新:强>
或许你想要IQueryable<Stock>
:
public IQueryable<Stock> ListProducts(string prodcutType)
{
var results = from p in db.Products
join s in db.Stocks
on p.ID equals s.IDProduct
where p.ptype == prodcutType
select s;
return results;
}
如果只想要3个属性width + height + number,则创建新类型。例如:
public class SomeType {
public int Width { get; set; }
public int Height { get; set; }
public int Number { get; set; }
}
public IQueryable<SomeType> ListProducts(string prodcutType)
{
var results = from p in db.Products
join s in db.Stocks
on p.ID equals s.IDProduct
where p.ptype == prodcutType
select new SomeType {
Width = s.width,
Height = s.height,
Number = s.number
};
return results;
}
答案 1 :(得分:1)
LINQ查询的最后一行
select new { s.width, s.height, s.number};
将只从表“db.Stocks”中选择这三个字段,这将创建一个新的匿名类型,它将存储在“结果”中并传回。
你在“返回结果”中传回的内容;声明因此不是一个IQueryable<Product>
- 这是完全不同的东西(即匿名类型的IQueryable)。
如果您想退回产品,则需要将该匿名类型转换为“产品”(或从所选字段中创建新产品类)。
马克