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

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

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

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

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

спасибо

12 голосов | спросил Oskar 28 MarpmSat, 28 Mar 2009 20:38:32 +03002009-03-28T20:38:32+03:0008 2009, 20:38:32

5 ответов


0

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

ответил Jon Skeet 28 MarpmSat, 28 Mar 2009 20:42:29 +03002009-03-28T20:42:29+03:0008 2009, 20:42:29
0
public void DoSomething(IQueryable query) { ... }

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

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

public void DoSomething(Expression exp) { ... }
ответил Konstantin Tarkus 28 MarpmSat, 28 Mar 2009 20:43:37 +03002009-03-28T20:43:37+03:0008 2009, 20:43:37
0

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

ответил Adam Robinson 28 MarpmSat, 28 Mar 2009 20:49:41 +03002009-03-28T20:49:41+03:0008 2009, 20:49:41
0

вы также можете использовать следующий код:

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



    private void methodName (IEnumerable<TableName> result) 
    {
      codes.....
    }
ответил Daniel 14 AM00000090000003331 2011, 09:56:33
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;
}
ответил William 24 FebruaryEurope/MoscowbMon, 24 Feb 2014 10:43:11 +0400000000amMon, 24 Feb 2014 10:43:11 +040014 2014, 10:43:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132