如何将(和 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 属性。因此,您需要明确指出它应该采用的类型。此方法无需通用。
我希望能够将 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 属性。因此,您需要明确指出它应该采用的类型。此方法无需通用。