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