Проблема выбора C# Linq в цепочке метода

Обратите внимание, что _src наследовались IQueryable<U> и V наследовались new();

Я записал следующее утверждение, нет никакой синтаксической ошибки.

IQueryable<V> a = from s in _src where (s.Right - 1 == s.Left) select new V();

Но если я Переписал его следующим образом, редактор Visual Studio жалуется ошибка в "Выборе"

IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(s=> new V());

Ошибка:

The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly.
Candidates are:
  System.Collections.Generic.IEnumerable<V> Select<U,V>(this System.Collections.Generic.IEnumerable<U>, System.Func<U,V>) (in class Enumerable)
  System.Linq.IQueryable<V> Select<U,V>(this System.Linq.IQueryable<U>, System.Linq.Expressions.Expression<System.Func<U,V>>) (in class Queryable)

Кто-либо мог объяснить это явление, и что решение состоит в том, чтобы зафиксировать ошибку?

=== Редактирование (16.03.2010 17:35) ===

Спасибо Mike Два. Я также попробовал простой пример как Вы. Это работает, но это не делает в моем. Я отправил код следующим образом:

public class NSM<U, V> where U : IQueryable<U> where V : new()  
  {
    private U _src;
    public NSM(U source) { _src = source; }
    public IQueryable<V> LeafNodes
    {
      get
        {
          return from s in _src where (s.Right - 1 == s.Left) select new V();
        }
    }
  }

Я хочу, чтобы функция LeafNodes была переписана в linq метод цепочки метода. Какая-либо Идея?

5
задан Gnought 16 March 2010 в 09:40
поделиться

4 ответа

Каков тип _src? Реализует ли он непосредственно IQueryable? Я спрашиваю потому, что могу заставить работать упрощенный пример того, что вы показываете.

IQueryable< int > ints = Enumerable.Range( 4, 12 ).AsQueryable();

IQueryable< decimal > foo = from s in ints where s > 7 select s * 4.2m;

IQueryable< decimal > bar = ints.Where( s => s > 7 ).Select( s => s * 4.2m );

Оба этих селекта работают для меня. Я думаю, если компилятор знает, что ints (или в вашем случае _src) - это IQueryable, то он вызовет нужную перегрузку. Или я что-то упустил? Возможно, я слишком упростил и упустил некоторые детали.

EDIT: Расширение этого для использования нового примера кода с некоторыми изменениями.

Фокус в том, что Queryable.Select принимает Expression>, а Enumerable. Select принимает Func Так что вам просто нужно предоставить Expression версию для Select

public interface ILeftRight
{
    int Right { get;}
    int Left { get; }
}

public class NSM<X, U, V> where U : IQueryable<X> where X : ILeftRight where V : new()  
{
    private readonly U _src;
    public NSM(U source) { _src = source; }
    public IQueryable<V> LeafNodes
    {
        get
        {
            //return from s in _src where (s.Right - 1 == s.Left) select new V();
            Expression< Func< X, V > > expression = s => new V();
            return _src.Where( s => s.Right - 1 == s.Left ).Select( expression );
        }
    }
}

Или из оригинального кода

Expression<Func<X,V>> expression = s => new V();
IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(expression);
1
ответ дан 15 December 2019 в 06:22
поделиться

Проблема, с которой вы столкнулись, заключается в том, что во втором примере есть два разных использования для Select, и у вас есть соответствующий оператор using для доступа к обоим из их. Компилятор не может понять из этого оператора, какой из них вы хотите использовать. Вам нужно либо использовать более специализированный вызов для выбора, либо удалить использование, если оно больше не требуется, либо каким-либо другим способом уточнить, какой из них вы хотите использовать.

1
ответ дан 15 December 2019 в 06:22
поделиться

Ошибка возникает из-за того, что компилятор Невозможно выбрать методы для выполнения: Выберите метод расширения для IEnumerable или Выберите метод расширения для IQueryable

1
ответ дан 15 December 2019 в 06:22
поделиться

Для устранения неоднозначности компилятора используйте функцию AsEnumerable()

src.AsEnumerable().Select(s => new V());

Или присвоить IQueryable

IQueryable<V> x = src.AsEnumerable().Select(s => new V()).AsQueryable();
0
ответ дан 15 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

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