C# 如何通过(和返回)LINQ IQueryable<;T>;去参加一个活动?

C# 如何通过(和返回)LINQ IQueryable<;T>;去参加一个活动?,c#,asp.net,.net,linq,iqueryable,C#,Asp.net,.net,Linq,Iqueryable,我希望能够将IQueryable传递(并返回)到用于添加表达式逻辑的函数: public void getShips() { var shipyard = from ship in db.Ships select new { ship }; var ballerShips = GetExpensiveShips(shipyard); } public IQueryable<T> GetExpensiveShips<T

我希望能够将
IQueryable
传递(并返回)到用于添加表达式逻辑的函数:

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
}
我曾尝试为
shippyard
定义一个接口,并在其中添加
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);
}
接口IShip
{
int NetValue{get;}
}
船级社:IShip
{
public int NetValue{get;set;}
}
公共IQueryable GetExpensiveShips(IQueryable查询)
其中T:IShip,class
{
返回query.Where(q=>q.NetValue>150000);
}

您需要一些包含
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);
}
接口IShip
{
int NetValue{get;}
}
船级社:IShip
{
public int NetValue{get;set;}
}
公共IQueryable GetExpensiveShips(IQueryable查询)
其中T:IShip,class
{
返回query.Where(q=>q.NetValue>150000);
}

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

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

select ship;
然后将方法声明更改为:

public IQueryable<Ship> GetExpensiveShips(IQueryable<Ship> query)
publicIQueryable获取费用(IQueryable查询)

您的方法已经编写好,因此它只能在
Ship
实例上工作-它使用Ship.NetValue属性。因此,您需要明确指出,这是它应该采用的类型。这种方法没有必要是通用的。

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

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

select ship;
然后将方法声明更改为:

public IQueryable<Ship> GetExpensiveShips(IQueryable<Ship> query)
publicIQueryable获取费用(IQueryable查询)


您的方法已经编写好,因此它只能在
Ship
实例上工作-它使用Ship.NetValue属性。因此,您需要明确指出,这是它应该采用的类型。这个方法不需要泛型。

一个问题:为什么T:class?@AlKepp-EF不能处理结构和接口。它需要类来实现对象hanks,Backs!我可能最终会走这条路,但不添加接口/类是否可以实现这一点?这将产生数百行样板文件=(@jiy:You永远不能调用T。如果T不是该方法的接口/类,任何事情都可以调用。@jiy我不知道您的情况,这只是一个解决方案。此外,您可以使用
Ship
而不是
T
,或者对所有具有
NetValue
的对象使用基类。这取决于您的项目一个问题:为什么T:class?@AlKepp EF不能与h结构和接口。它需要类来具体化对象hanks,Backs!我可能会走这条路,但不添加接口/类是否可以实现这一点?这将导致数百行样板文件=(@jiy:你永远不能调用T。如果T不是该方法的接口/类,任何事情都可以调用。@jiy我不知道你的情况,这只是一种解决方案。此外,你可以使用
Ship
而不是
T
,或者对所有对象使用基类,这些对象具有
NetValue
。这取决于你的项目“这个方法不需要通用。”让您在这里投票。使用约束似乎有点吵。谢谢!所以我必须为ship创建一个接口/类?有没有办法避免这样做?我的类必须支持大量嵌套,这将是混乱的。@jiy不,您不需要创建类或接口。您正在使用
ship
类已经存在。如果您查看
db.Ships
,它的类型是
DbSet
。这就是您要传递的类型,也是您编写方法所期望的类型。剩下的就是告诉编译器。哎哟,我刚刚意识到您通过添加匿名类型(没有任何理由这么做)增加了额外的复杂性。更新了我的答案。@JoeWhite感谢您的解释。不幸的是,由于我的示例被大大简化,它无法表达实际的复杂性。IQueryable
造船厂将是多个连接的组合,因此不符合EF已经知道的内容。“此方法不需要通用。”让您在这里投票。使用约束似乎有点吵。谢谢!所以我必须为ship创建一个接口/类?有没有办法避免这样做?我的类必须支持大量嵌套,这将是混乱的。@jiy不,您不需要创建类或接口。您正在使用
ship
类已经存在。如果您查看
db.Ships
,它的类型是
DbSet
。这就是您要传递的类型,也是您编写方法所期望的类型。剩下的就是告诉编译器。哎哟,我刚刚意识到您通过添加匿名类型(没有任何理由这么做)增加了额外的复杂性。更新了我的答案。@JoeWhite感谢您的解释。不幸的是,由于我的示例被大大简化,它无法表达实际的复杂性。IQueryable
造船厂将是多个连接的组合,因此不符合EF已经知道的内容。如果不添加数百个f行界面/类垃圾,所以我只是复制/粘贴了大部分相似的LINQ语句,并称之为一天。糟糕的是,它不干,但至少我没有添加300多行样板。如果不添加数百行界面/类垃圾,我无法完成我需要的,所以我只是复制/粘贴了大部分相似的LINQ语句and称之为一天。糟糕的是它不干燥,但至少我没有添加300多行bo