我扩展了我的实体以实现其类型的特定接口。我正在尝试执行以下查询:
var results = from x in context.MyEntityTable
where x.AProperty == AValue
select x;
return results.Count() > 0 ? results.Cast<IApplicationEntity>().ToList() : null;
但是,我一直收到以下错误:
“LINQ to Entities仅支持转换实体数据模型基元类型”
基本上我想做的是将结果从原始实体类型转换为它实现的接口的通用列表。
这可能吗?
答案 0 :(得分:20)
您可以通过调用AsEnumerable
扩展方法绕过实体框架查询转换层,在客户端上执行转换:
return results.Any()
? results.AsEnumerable().Cast<IApplicationEntity>().ToList()
: null;
但是,最好颠倒执行Count
检查的顺序:
var list = results.AsEnumerable().Cast<IApplicationEntity>().ToList();
return list.Count == 0 ? null : list;
答案 1 :(得分:3)
如果要将结果转换为复杂类型,则需要强制代码使用LINQ to Objects而不是LINQ to Entities。
在演员之前调用AsEnumerable
扩展方法就是诀窍。
尝试以下方法:
var results = from x in context.MyEntityTable
where x.AProperty == AValue
select x;
return results.AsEnumerable().Cast<IApplicationEntity>().ToList();
另请注意,在枚举上检查Count()
是不明智的,因为这意味着集合会重复两次。
答案 2 :(得分:0)
return results.Count() > 0 ?
results.Select(result => (IApplicationEntity)result)
.ToList() : null;