我希望能够将IQueryable<T>
传递给(并返回(函数以添加表达式逻辑:
public void getShips()
{
var shipyard =
from ship in db.Ships
select new { ship };
var ballerShips = GetExpensiveShips(shipyard);
}
public IQueryable<T> GetExpensiveShips<T>(IQueryable<T> query)
{
return query.Where(q => q.NetValue > 150000); // <== Error CS1061
}
返回此错误:
Error CS1061 'T' does not contain a definition for 'NetValue' and no
extension method 'NetValue' accepting a first argument of type 'T' could be
found (are you missing a using directive or an assembly reference?
我尝试为shipyard
定义一个接口并添加where T : IShipyard
但这似乎会导致更多问题并导致大量样板。
我还想避免在通过我的函数之前执行 SQL。
这可能吗?
您需要删除一些不必要的复杂性。
将查询的最后一行更改为:
select ship;
然后将方法声明更改为:
public IQueryable<Ship> GetExpensiveShips(IQueryable<Ship> query)
您的方法已经编写,因此它仅适用于Ship
实例 - 它使用 Ship.NetValue 属性。因此,您需要明确这是它应该采用的类型。此方法不需要是通用的。
你需要一些东西,包含NetValue
属性。T
是没有属性的泛型类型。因此,添加接口是正确的方法:
interface IShip
{
int NetValue {get;}
}
class Ship : IShip
{
public int NetValue {get;set;}
}
public IQueryable<T> GetExpensiveShips<T>(IQueryable<T> query)
where T : IShip, class
{
return query.Where(q => q.NetValue > 150000);
}