我有BaseDocument
,TextDocument
,ExcelDocument
和WordDocument
类。它们是从BaseDocument
继承的。我每个班都有收藏。假设BaseDocuments
集合从某些地方的子实体集合中获得价值。集合类型不同,其中一些是列表,另一种是IQuerable
,另一种是特定类型。 BaseDocuments
类型是IQuerable
,可从某些子实体集合中获取价值。看起来像这样:
using (Context context = new Context())
{
var words = context.GetEntities<BaseDocument>().Where(e => e.Name.StartsWith("Word")).ToList(); // type of collection is list
var excels = context.GetEntities<BaseDocument>().Where(e => e.Name.StartsWith("Excel"));
var texts = context.GetEntities<BaseDocument>().Where(e => e.Name.StartsWith("Text"));
var wordsAsQuery = words.AsQueryable();
baseDocuments = wordsAsQuery.Concat(excels).Concat(texts);
}
如您所见,我正在使用Concat方法。但是当我做var instaces = baseDocuments.ToList();
时会抛出异常:
System.InvalidOperationException:'此方法支持LINQ 实体基础架构,不能直接用于 您的代码。
我做了一些研究,每次修复代码后,我都会遇到另一个异常,例如
LINQ错误DbUnionAllExpression需要具有兼容参数 集合ResultTypes。
我可以执行ToList所有子集合,但这没有任何意义,这将是性能问题。
如何将不同类型的集合连接到IQuerable集合?可能吗?
有关模型的更多信息,您可以看到我的最后一个问题:Loading instance of entity takes more than 1 second
答案 0 :(得分:0)
为什么要先ToList
处理Word文档,然后对它们进行AsQueryable
?您使LINQ忘记了有关数据库结构的所有内容,并处理了内存中的word
集合。然后,通过实际查询将其告知Concat
时,您将得到指定的错误。为什么不只是:
using (Context context = new Context())
{
var words = context.GetEntities<BaseDocument>().Where(e => e.Name.StartsWith("Word"));
var excels = context.GetEntities<BaseDocument>().Where(e => e.Name.StartsWith("Excel"));
var texts = context.GetEntities<BaseDocument>().Where(e => e.Name.StartsWith("Text"));
baseDocuments = words.Concat(excels).Concat(texts);
}