Как передать запрос Linq методу?

Я хочу передать запрос Linq методу, как указать тип аргумента?

Мой запрос ссылки выглядит примерно так:

var query =
    from p in pointList
    where p.X < 100
    select new {X = p.X, Y = p.Y}

ясно, что я новичок в Linq и, вероятно, избавлюсь от метода приема, в конце концов, когда я преобразую остальную часть своего кода, но мне кажется, что я должен знать...

спасибо

Ответ 1

Вам понадобится либо использовать обычный тип для проекции, либо сделать метод, по которому вы передаете его, в общий (что будет означать, что вы не можете с ним справиться). Что именно ты пытаешься сделать? Если вам нужно использовать значения 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);

Ответ 2

public void DoSomething(IQueryable query) { ... }

public void DoSomething<T>(IQueryable<T> query) { ... }

И на всякий случай (если вам понадобятся пропущенные выражения):

public void DoSomething(Expression exp) { ... }

Ответ 3

В то время как оба tvanfosson и Jon являются правильными, вы можете просто написать свою функцию, чтобы принять IEnumerable<T> (вы можете либо сделать свою функцию общей, либо указать конкретную конкретную общую версию, которую вы хотите, что более вероятно, правильный вариант), поскольку LINQ to Objects создает IEnumerable<T>, а LINQ to SQL создает IQueryable<T>, который реализует IEnumerable<T>. Этот параметр должен позволить вам быть агностически-исходным.

Ответ 4

вы также можете использовать приведенный ниже код:

    IEnumerable <TableName> result = from x in dataBase.TableName
                                     select x;     
    methodName(result);



    private void methodName (IEnumerable<TableName> result) 
    {
      codes.....
    }

Ответ 5

Я думаю, что вы ищете класс 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;
}