Comments 13
У меня в проекте такой код работает нормально:
Что если вместо интерфейса использовать абстрактный класс?
public static IQueryable<T> Range<T>(this IDbSet<T> set, HashSet<long> ids) where T : EntityBase
{
return set.Where(x => ids.Contains(x.Id));
}
Что если вместо интерфейса использовать абстрактный класс?
0
Попробовал для интереса не интерфейс, а базовый класс — та же фигня, только теперь в ошибке написано, что не может привести объект к базовому классу.
Ваш пример также не работает, единственное отличие, я дописал материализацию запроса в массив:
Ваш пример также не работает, единственное отличие, я дописал материализацию запроса в массив:
public static T[] Range<T>(this IDbSet<T> set, HashSet<long> ids) where T : EntityBase
{
return set.Where(x => ids.Contains(x.Id)).ToArray();
}
0
Так, а давайте ради интереса сделаем
return ((IQueryable)DbSet<TEntity>()).FirstOrDefault(x => x.Id == "id");
0
Ну, так компилятор не даст сделать — IQueryable не приводится к IQueryable.
Думаю, что ваш код работает, потому что подготовленный IQueryable уходит в ODataProvider,
который дополнительно преобразовывает выражение.
Думаю, что ваш код работает, потому что подготовленный IQueryable уходит в ODataProvider,
который дополнительно преобразовывает выражение.
0
Я хотел сказать
:) DbSet точно должен приводиться к IQueryable.
return ((IQueryable<TEntity>)DbSet<TEntity>()).FirstOrDefault(x => x.Id == "id");
:) DbSet точно должен приводиться к IQueryable.
0
У нас обоих парсер порезал типизированные генерики )))
В любом случае, явное приведение DbSet к IQueryable ничего не меняет, т.к. FirstOrDefault — это именно метод-расширение интерфейса IQueryable, а не DbSet.
В любом случае, явное приведение DbSet к IQueryable ничего не меняет, т.к. FirstOrDefault — это именно метод-расширение интерфейса IQueryable, а не DbSet.
0
Надо приводить не к IQueryable<TEntity> — это ничего не дает, а к IQueryable<EntityBase>, пользуясь ковариантностью IQueryable<>. В таком случае в лямбде у параметра x будет тип EntityBase — и у компилятора не будет причин явно добавлять преобразование типов.
+1
Меня очень смущает “LINQ to Entities” в тексте ошибки. У меня такое бывало, когда в блоке using был зарефан только System.Ling. Тогда по факту DbSet неявно приводится к IEnumerable и FirstOrDefault применяется уже к нему, используя механизм Linq to Entities вместо Linq to SQL.
0
Sign up to leave a comment.
Критическое отличие компиляции дерева выражений в Visual Studio 2015