Linq where-filter导致强制转换为基类

时间:2017-12-01 12:29:10

标签: c# linq entity-framework-6 odata breeze

我有一个具体类的通用IQueryable:

IQueryable<Person> result = GetAllEmployees(); //returns IQueryable<Employee>

如果我在Breeze-Entitytype的服务调用中返回result,一切正常:

breeze.EntityQuery.from("Employees").orderBy("EmployeeID");

只要在service-call中向result添加where-filter,整个IQueryable-Object就会被转换为基类Person而没有属性{{ 1}}:

EmployeeID

这会导致以下错误:

IQueryable<Person> result = GetAllEmployees(); //returns IQueryable<Employee>
result = result.Where(o => myHashSet.Contains(o.Id));

1 个答案:

答案 0 :(得分:0)

显然whereIQueryable包装到存储的变量类型的新IQueryable中。原始IQueryable的ElementType将丢失。< / p>

当你在where休息并检查result.ElementType时,你可以看到这一点。一旦您跨过where,它就会从Employee更改为Person

使用以下代码,我们会恢复ElementType(从result.ElementType之前用where提供):

public static IQueryable<T> ToTypedQueryable<T>(this IEnumerable<T> source, Type theType, bool exact = false) {
    if (source == null) throw new ArgumentNullException("source");

    System.Collections.IList result = (System.Collections.IList)typeof(List<>)
        .MakeGenericType(theType)
        .GetConstructor(Type.EmptyTypes)
        .Invoke(null);

    foreach (var s in source) {
        Type t = s.GetType();
        if (t == theType) {
            result.Add(s);
        } else if (!exact && t.IsSubclassOf(theType)) {
            result.Add(s);
        }
    }

    return (IQueryable<T>)(result.AsQueryable());
}