var kitchens = from h in houses
where h.MainRoom.Type == RoomType.Kitchen
select h;
Но вы должны установить свойство RoomType
в комнатах раньше.
Хорошо, отредактируйте:
, поэтому вы должны переопределить:
var comparison = Expression.Lambda<Func<House, bool>>(...
Затем, когда вы используете его:
var kitchens = houses.AsQueryable().Where(comparison.Compile());
Правка # 2:
Хорошо, вот, пожалуйста:
var roomTypeParam = Expression.Parameter(typeof(RoomType), "roomType");
// ???????????????????????? DOES NOT WORK
var comparison = Expression.Lambda<Func<House, bool>>(
Expression.Equal(houseMainRoomTypeParam,
Expression.Constant(Enum.Parse(typeof(RoomType), "Kitchen"), typeof(RoomType))), houseParam);
// ???????????????????????? DOES NOT WORK
var kitchens = houses.AsQueryable().Where(comparison);
Правка # 3: Из, для ваших нуждУ меня пока нет идей.Я дам вам один последний:
Объявите метод расширения для типа String:
internal static object Prepare(this string value, Type type)
{
if (type.IsEnum)
return Enum.Parse(type, value);
return value;
}
Затем используйте его в этом выражении как:
Expression.Constant("Kitchen".Prepare(typeof(RoomType)), typeof(RoomType))
Это потому, чтопо-видимому, перечисления рассматриваются по-разному.Это расширение оставит строку без изменений для других типов.Недостаток: вы должны добавить еще typeof()
туда.