【发布时间】:2020-10-09 12:34:35
【问题描述】:
此 LINQ 语句:
var entities = SomeEntities.Where(se => se.SomeProperty == "SomeValue");
var stringList = new List<string> { "string1", "string2", "string3" }
var startsWith = stringList.Select(x => x + "%");
entities = entities.Where(e => startsWith.Any(sw => DbFunctions.Like(e.StringProperty, sw))).Select(e => e.Id);
产生类似的 SQL 查询,如下所示:
SELECT
[Project8].[Id] AS [Id]
FROM ( SELECT
[Extent1].[Id] AS [Id],
FROM [SomeEntities] AS [Extent1]
WHERE ([Extent1].[SomeProperty] == 'SomeValue') AND( EXISTS (SELECT
1 AS [C1]
FROM (SELECT
N'string1%' AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
N'string2%' AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]
UNION ALL
SELECT
N'string3%' AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable3]) AS [UnionAll2]
WHERE [Extent1].[StringProperty] LIKE [UnionAll2].[C1]
)))
) AS [Project8]
ORDER BY [Project8].[Status] DESC
如何实现类似于以下的查询:
SELECT [Id]
FROM [SomeEntities]
WHERE [SomeProperty] == 'SomeValue'
AND (StringProperty] LIKE 'string1%'
OR StringProperty] LIKE 'string2%'
OR StringProperty] LIKE 'string3%')
【问题讨论】:
-
Where(se => se.SomeProperty == "SomeValue" && startsWith.Any( sw => se.StringProperty.StartsWith( sw )))? -
要获得准确的 SQL 或非常接近它的东西,您必须手动创建表达式。但是,我不会太担心生成的确切 SQL。只需担心正确性,然后如果性能存在问题,请考虑修复。
-
如果您关心 SQL 和性能,您一开始就不应该使用 LINQ-to-SQL。该项目主要是作为 LINQ 的演示而创建的。它有很多性能问题,包括没有警告的客户端评估。如果您改用 EF Core,会发生什么情况?
标签: c# performance linq linq-to-sql