如何连接IQuerable <T>和List <T>

时间:2019-07-12 04:57:18

标签: c# entity-framework concat iqueryable

我有BaseDocumentTextDocumentExcelDocumentWordDocument类。它们是从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

1 个答案:

答案 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);
}