Нет универсального метода ‘Where’ для типа ‘System.Linq.Queryable’ совместим с предоставленными аргументами типа и

#linq #iqueryable

#linq #iqueryable

Вопрос:

Я хочу получить конкретную запись, используя IQueryable. Но я получаю ошибку ‘No generic method ‘Where ‘для типа ‘System.Linq.Queryable’ совместим с предоставленными аргументами типа и аргументациями. Аргументы типа не должны предоставляться, если метод не является универсальным.’. Я получил идентификатор выбранной строки, но я не могу его отобразить. Вот мой код.

  internal static IQueryable GetRecordsFromPrimaryKeys(this IQueryable datasource, List<FilterDescriptor> primaryKeys)
    {
        IQueryable data = datasource;

        ParameterExpression paramExp = null;
        bool firstLoop = false;
        System.Linq.Expressions.Expression predicate = null;

        var RecordType = datasource.GetObjectType();
        paramExp = RecordType.Parameter();

        foreach (FilterDescriptor primaryKey in primaryKeys)
        {
            if (!(firstLoop))
            {
                predicate = data.Predicate(paramExp, primaryKey.ColumnName, primaryKey.Value, FilterType.Equals, false, RecordType);
                firstLoop = true;
            }
            else
            {
                predicate = predicate.AndPredicate(data.Predicate(paramExp, primaryKey.ColumnName, primaryKey.Value, FilterType.Equals, false, RecordType));
            }
        }

        if (paramExp != null amp;amp; predicate != null)
        {
            var lambda = Expression.Lambda(predicate, paramExp);
            data = data.Provider.CreateQuery(
                       Expression.Call(
                       typeof(Queryable),
                       "Where",
                       new Type[] { data.ElementType },
                       data.Expression,
                       lambda
                       )
                   );

        }

        return data;
    }
  

Мой код хорошо работает для IEnumerable / IQueryable / ICollection . Но он выдает исключение, когда я указываю класс с ключевым словом virtual и типом как ICollection. Мой код

 public class RoomType
{
    public int ID { get; set; }

    [MaxLength(10, ErrorMessage = "Room code cannot be longer than 10 characters.")]
    public string Code { get; set; }

    [MaxLength(50, ErrorMessage = "Room name cannot be longer than 50 characters.")]
    public string Name { get; set; }

    public virtual ICollection<RoomCategory> RoomCategories { get; set; }
}
  

Некоторые случайные значения добавляются к ‘RecordType’ при использовании ключевого слова ‘virtual’. Я думаю, что это приводит к исключению. Все еще ищу решение.

Я не знаю, что происходит не так. Любые предложения приветствуются.

Спасибо.

Комментарии:

1. Я думаю, что ваш код должен работать. Вы уверены, что все ваши типы совпадают?

Ответ №1:

Я только что столкнулся с аналогичной ситуацией. Проблема связана с тем фактом, что в некоторых случаях вы имеете дело с «прокси», а не с фактическим объектом. Итак, вы хотите убедиться, что это RecordType соответствует data.ElementType .

попробуйте:

 var recordType = datasource.GetObjectType();

// make sure we have the correct type (not the proxy)
if (recordType.BaseType.Name != "Object") 
    recordType = recordType.BaseType;
  

Или еще лучше, попробуйте:

 var recordType = data.ElementType
  

Ответ №2:

Попробуйте использовать typeof(Enumerable) вместо typeof(Queryable)