このユーティリティ クラスを使用します
public static class Utility
{
//public static IEnumerable<TTarget> Where<TSource, TTarget>(this IEnumerable<TSource> source, Expression<Func<TSource, bool>> predicate) where TTarget : class, TSource
//{
// return source.Where(obj => obj is TTarget).Where(predicate.Compile()).Select(obj => obj as TTarget);
//}
public static IQueryable<TTarget> Where<TSource, TTarget>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) where TTarget : class, TSource
{
return source.Where(obj => obj is TTarget).Where(predicate).Select(obj => obj as TTarget);
}
}
例はこのようなもので、スーパークラスとサブクラスは次のようになります
class Person
{
public String Name { get; set; }
public ushort Age { get; set; }
}
class Student : Person
{
public String StudentId { get; set; }
}
class Teacher : Person
{
public String TeacherId { get; set; }
}
ユーティリティを使用してテストする
/*List of Persons*/
List<Person> persons = new List<Person>()
{
new Student(){StudentId = "Std-01", Name = "Roy", Age = 24},
new Student(){StudentId = "Std-02", Name = "Jhon", Age = 25},
new Teacher(){TeacherId = "Tch-01", Name = "Roy", Age = 24},
new Teacher(){TeacherId = "Tch-02", Name = "Jhon", Age = 25}
};
/*predictions*/
Expression<Func<Person, bool>> prediction = x => x.Name.Contains("o");
/*Use the utility*/
/*Get Teacher from Persons*/
IQueryable<Teacher> filteredItems = persons.AsQueryable().Where<Person, Teacher>(prediction);
List<Teacher> result = filteredItems.ToList();
その結果、TeacherId="Tch-01" And "Tch-02" を持つ教師を取得します
IQueryableではなくIEnumerableで作業しましたが、役に立てば幸いです