#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)