如何将Linq查询传递给方法?

时间:2009-03-28 17:38:32

标签: c# .net linq

我想将Linq查询传递给方法,如何指定参数类型?

我的链接查询类似于:

var query =
    from p in pointList
    where p.X < 100
    select new {X = p.X, Y = p.Y}
很明显我是Linq的新手,当我转换剩余的代码时,最终可能会摆脱接收方法,但这似乎是我应该知道的......

感谢

5 个答案:

答案 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;
}