【发布时间】:2019-10-20 22:21:27
【问题描述】:
我有 4 个使用 EntityFramework 的查询在拖车/卡车/汽车/工厂上运行,由于结果量大,我需要在执行之前将它们连接在一起。
所有 4 个实体都继承自 Asset 类型。
这是我尝试执行的代码和不同的代码变体:
var truckModels = await truckService.GetAll();
var trailerModels = await trailerService.GetAll();
var companyCarModels = await companyCarService.GetAll();
var plantModels = await plantService.GetAll();
什么都没有:
assetModels = truckModels.Cast<Asset>()
.Union(trailerModels)
.Union(companyCarModels)
.Union(plantModels);
有演员表:
assetModels = truckModels.Cast<Asset>()
.Union(trailerModels.Cast<Asset>())
.Union(companyCarModels.Cast<Asset>())
.Union(plantModels.Cast<Asset>());
使用 AsEnumerable:
assetModels = truckModels.Cast<Asset>()
.Union(trailerModels.AsEnumerable())
.Union(companyCarModels.AsEnumerable())
.Union(plantModels.AsEnumerable());
使用 Cast 和 AsEnumerable:
assetModels = truckModels.Cast<Asset>()
.Union(trailerModels.Cast<Asset>().AsEnumerable())
.Union(companyCarModels.Cast<Asset>().AsEnumerable())
.Union(plantModels.Cast<Asset>().AsEnumerable());
但是,我在所有变体中都收到以下错误:
“此方法支持 LINQ to Entities 基础架构,不打算直接从您的代码中使用。”
at System.Data.Entity.Core.Objects.ObjectQuery`1.MergeAs(MergeOption mergeOption) at lambda_method(Closure ) at System.Linq.EnumerableExecutor`1.Execute() at System.Linq.EnumerableQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) at Kendo.Mvc.Extensions.QueryableExtensions.Count(IQueryable source) at Kendo.Mvc.Extensions.QueryableExtensions.CreateDataSourceResult[TModel,TResult](IQueryable queryable, DataSourceRequest request, ModelStateDictionary modelState, Func`2 selector) at Kendo.Mvc.Extensions.QueryableExtensions.<>c__DisplayClass10.<ToDataSourceResultAsync>b__f() at System.Threading.Tasks.Task`1.InnerInvoke() at System.Threading.Tasks.Task.Execute() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Viper.Web.Areas.Assets.Controllers.AllController.<GetAssets>d__7.MoveNext() in C:\Repositories\ViperRepo\Viper\Viper.Web\Areas\Assets\Controllers\AllController.cs:line 90
有什么想法吗?我以为你可以合并 IQueryable...
【问题讨论】:
-
不太确定这里发生了什么,但是如果您的所有可查询对象都属于同一类型,那么查询不能一次性完成而不是将 4 个合并在一起吗?
-
如果你这样做
AsEnumerable()为什么你会得到一个 LINQ to Entities 异常......你到底从哪里得到这个异常? -
实体的类型不同,但都继承自 Asset。尝试评估资产模型时出现异常
-
你能发布完整的堆栈跟踪吗?
-
我认为您需要像使用
truckModels一样将它们全部转换为Asset。虽然是疯狂的猜测。
标签: c# performance entity-framework linq iqueryable