LINQ-to-SQL имеет некоторую поддержку наследования через дискриминатор ( здесь , здесь ), но вы можете запрашивать только те классы, которые определены в модели LINQ - т.е. самих классов данных и (что, возможно, более важно для этого примера) сам запрос должен быть сформулирован в терминах классов данных: хотя TEntity является классом данных, он знает, что свойство здесь объявлено на базе сущностей .
Одним из вариантов могут быть динамические выражения; если сами классы объявили свойство (то есть потеряли базовый класс, но сохранили интерфейс), но это не тривиально.
Работа над выражением будет выглядеть примерно так, как показано ниже, отметив, что вы можете либо передать строку в качестве аргумента, либо получить первичный ключ посредством отражения (если оно приписано):
static Expression<Func<T, bool>> BuildWhere<T>(int deviceId) {
var id = Expression.Constant(deviceId, typeof(int));
var arg = Expression.Parameter(typeof(T), "x");
var prop = Expression.Property(arg, "DeviceId");
return Expression.Lambda<Func<T, bool>>(
Expression.Equal(prop, id), arg);
}