我有一个查询应该返回IQueryable<MyType>
。代码如下所示:
public IQueryable<MyType> GetFooList()
{
var query = (from x in dbContext.TableX
join y in dbContext.TableY on x.our_id equals y.our_id
join z in dbContext.TableZ on y.our_id equals z.our_id
join a in dbContext.TableA on z.other_id equals a.other_id
where !string.IsNullOrEmpty(x.status)
select new
{
(fields....)
})
.AsQueryable();
IQueryable<MyType> result = (IQueryable<MyType>) query;
return result;
}
在调用控制器操作中,我想过滤此列表以查找运行时指定的值;不同调用操作之间要过滤的参数会有所不同。例如。:
List<MyType> FooList = Interface.GetFooList()
.Where( specific conditions )
.ToList();
上线设置result
,会引发异常:
用户代码未处理无效的强制转换异常
无法转换类型的对象
'System.Data.Entity.Infrastruct.DbQuery'1[f__AnonymousType9'9[System.String,System.Nullable`1[System.DateTime],System.String,System.String,System.String,System.String, System.Int32,System.Nullable'1[System.DateTime],System.Nullable'1[System.DateTime]]]'
输入“System.Linq.IQueryable”1[MyType]”。
所以我认为这是一个铸造问题,并补充说.Cast<MyType>()
在致电之前AsQueryable()
。这会产生不同的错误:
无法将类型“匿名类型”转换为类型“MyType”。链接到
实体仅支持转换 EDM 基元或枚举类型。
如果我不进行任何转换,这些错误将在调用操作而不是实体框架访问器中引发。
我已经尝试了所有链接的“类似问题”中的建议,但无济于事——错误不断来回出现。我什至尝试过包括.Select(obj => new MyType() {fields...} )
摆脱匿名类型。那也没用。
我觉得我错过了一些微妙而明显的东西。
编辑添加
我更新了代码以选择类型:select new MyType() {fields...}
。这工作正常。然后调用方法抛出了一个不支持异常,在我过滤结果并从查询中创建列表的行上:
实体或复杂类型“MyType”无法在
LINQ to 实体查询。
ETA2
我将 EF 表属性复制到新类 MyTypeDTO。我用 MyTypeDTO 替换了所有对 MyType 的使用。我收到这个错误:
LINQ to Entities 不支持指定的类型成员“our_id”。仅支持初始值设定项、实体成员和实体导航属性。
这是 DTO 中的属性:
public int our_id { get; set; }
所以我删除了 get/set,重建并重新运行。不,我遇到了同样的错误。