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

How to pass (and return) LINQ IQueryable<T> to a Function?

我希望能够将 IQueryable<T> 传递(和 return)到函数以添加表达式逻辑:

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
}

Returns 这个错误:

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 直到通过我的函数。

这可能吗?

您需要一些东西,其中包含 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);
}

您需要删除一些不必要的复杂性。

将查询的最后一行更改为:

select ship;

然后将您的方法声明更改为:

public IQueryable<Ship> GetExpensiveShips(IQueryable<Ship> query)

您的方法已编写,因此它仅适用于 Ship 个实例 - 它使用 Ship.NetValue 属性。因此,您需要明确指出它应该采用的类型。此方法无需通用。