我想将Linq查询传递给方法,如何指定参数类型?
我的链接查询类似于:
var query =
from p in pointList
where p.X < 100
select new {X = p.X, Y = p.Y}
很明显我是Linq的新手,当我转换剩余的代码时,最终可能会摆脱接收方法,但这似乎是我应该知道的......
感谢
答案 0 :(得分:21)
你需要使用普通类型进行投影,或者将你传递给它的方法也用于通用(这意味着你不能用它做多少)。你究竟想做什么?如果需要使用方法中的X和Y值,则肯定需要创建普通类型。 (有很多可靠的方法可以避免它,但它们并不是一个好主意。)
注意:其他一些答案目前正在讨论IQueryable<T>
,但没有任何迹象表明您使用的是LINQ to Objects以外的任何内容,在这种情况下它将是IEnumerable<T>
而是 - 但是T
目前是匿名类型。如果您想要使用每个项目中的单个值,那么您需要处理这个问题。如果您不使用LINQ to Objects,请澄清问题,我将编辑此答案。
例如,获取当前查询(稍微破坏,因为您不能使用两个具有相同名称X的投影初始值设定项)。你要创建一个新类型,例如MyPoint
public sealed class MyPoint
{
private readonly int x;
private readonly int y;
public int X { get { return x; } }
public int Y { get { return y; } }
public MyPoint(int x, int y)
{
this.x = x;
this.y = y;
}
}
您的查询将是:
var query =
from p in pointList
where p.X < 100
select new MyPoint(p.X, p.Y);
然后您将方法编写为:
public void SomeMethod(IEnumerable<MyPoint> points)
{
...
}
并将其称为SomeMethod(query);
答案 1 :(得分:2)
public void DoSomething(IQueryable query) { ... }
public void DoSomething<T>(IQueryable<T> query) { ... }
以防万一(如果你需要传递表达式):
public void DoSomething(Expression exp) { ... }
答案 2 :(得分:1)
虽然tvanfosson和Jon都是正确的,但你可以编写你的函数来接受IEnumerable<T>
(你可以使你的函数通用,或者你可以指定你想要的具体通用版本,这更可能是正确的选项)因为LINQ to Objects产生IEnumerable<T>
而LINQ to SQL产生IQueryable<T>
,它实现IEnumerable<T>
。此选项应该允许您与源无关。
答案 3 :(得分:0)
您也可以使用以下代码:
IEnumerable <TableName> result = from x in dataBase.TableName
select x;
methodName(result);
private void methodName (IEnumerable<TableName> result)
{
codes.....
}
答案 4 :(得分:0)
我认为你要找的是Expression类。例如,
public void DoSomething()
{
User user = GetUser(x => x.ID == 12);
}
IQueryable<User> UserCollection;
public User GetUser(Expression<Func<User,bool>> expression)
{
return UserCollection.expression;
}