这里没有想法了。我有一个简单的表,模型首先与实体框架映射,并生成以下 SQL:
(@p__linq__0 int,@p__linq__1 int)SELECT
[Extent1].[BucketRef] AS [BucketRef],
[Extent1].[VariantNo] AS [VariantNo],
[Extent1].[SliceNo] AS [SliceNo],
[Extent1].[TradeNo] AS [TradeNo],
[Extent1].[TradeBegin] AS [TradeBegin],
[Extent1].[TradeEnd] AS [TradeEnd],
FROM [simstg].[Trade] AS [Extent1]
WHERE ((( CAST( [Extent1].[BucketRef] AS int) = @p__linq__0) AND ( NOT (( CAST( [Extent1].[BucketRef] AS int) IS NULL) OR (@p__linq__0 IS NULL)))) OR (( CAST( [Extent1].[BucketRef] AS int) IS NULL) AND (@p__linq__0 IS NULL))) AND ((( CAST( [Extent1].[VariantNo] AS int) = @p__linq__1) AND ( NOT (( CAST( [Extent1].[VariantNo] AS int) IS NULL) OR (@p__linq__1 IS NULL)))) OR (( CAST( [Extent1].[VariantNo] AS int) IS NULL) AND (@p__linq__1 IS NULL)))
所有这些演员都扼杀了表演。遗憾的是我没能看到它们来自哪里。
有问题的查询是:
var tradesQuery = repository.SimStgTrade
.Where(x => x.BucketRef == bucketId && x.VariantNo == set)
.ToArray();
这很简单。字段定义为:bucketId:short(数据库中的smallint),设置short,数据库中的smallint。因此,完全不需要演员阵容。我已经删除并重新创建了模型中的表 - 据我所知,映射匹配(字段为smallint)。因此,我们遇到了严重的性能问题 - 例如:查询超时,因为它不使用表扫描。
有人知道如何摆脱这些演员阵容并强制基于短裤进行比较吗?从 SQL 中可以很明显地看出,EF 决定首先将所有内容移至 int...,这毫无意义。
这不是一个“好不好”的事情。未完成的查询路径完全不同,生成的代码将其转换为自连接。在服务器管理器中,EF 变体需要 5 分钟以上,而使用简单 SQL 的优化版本需要 0.0 秒(返回该表中数十亿行中的 228 行)。