我有一个具体类的通用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));
答案 0 :(得分:0)
显然where
将IQueryable
包装到存储的变量类型的新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());
}