如何将 LINQ IQueryable 传递给(和返回)<T>到函数?



我希望能够将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);
}

最新更新