У меня возникла проблема, когда я изменил свой источник данных с источника привязки на запрос структуры сущности.
var query = dataSource as IQueryable;
var value = query.Where("prop = @0", value).Cast<object>().SingleOrDefault();
В рамках сущности это создает исключение `Невозможно привести тип 'customer' к типу 'object'. LINQ to Entities поддерживает только приведение типов примитивов и перечислений EDM.
Класс, в котором был мой код, не имел ссылки на библиотеку с моделью, поэтому ...Cast<customer>
был невозможен.
В любом случае, я использовал этот подход
var query = dataSource as IQueryable;
var targetType = query.GetType().GetGenericArguments()[0];
var value = query.Where("prop = @0", value).SingleOrDefault(targetType);
в сочетании с расширением IEnumerable, которое использует отражение
public static object SingleOrDefault(this IEnumerable enumerable, Type type)
{
var method = singleOrDefaultMethod.Value.MakeGenericMethod(new[] { type });
return method.Invoke(null, new[] { enumerable });
}
private static Lazy<MethodInfo> singleOrDefaultMethod
= new Lazy<MethodInfo>(() =>
typeof(Extensions).GetMethod(
"SingleOrDefault", BindingFlags.Static | BindingFlags.NonPublic));
private static T SingleOrDefault<T>(IEnumerable<T> enumerable)
{
return enumerable.SingleOrDefault();
}
Не стесняйтесь внедрять кэширование для каждого типа для повышения производительности.