У меня есть таблица с партией, и я использую ее через сущность.Как заставить Entity Framework генерировать отдельные предложения WHERE?
CREATE PARTITION FUNCTION PART_FN (NVARCHAR(10))
AS RANGE LEFT FOR VALUES ('CASE0');
CREATE PARTITION SCHEME PART_SCH
AS
PARTITION PART_FN
ALL TO ([PRIMARY]);
CREATE TABLE TEST_PART(ID INT NOT NULL PRIMARY KEY NONCLUSTERED ON [PRIMARY] IDENTITY, COL2 NVARCHAR(10), COL3 NVARCHAR(10))
ON PART_SCH(COL2);
DECLARE @C INT = 1000000;
SET IDENTITY_INSERT TEST_PART ON;
WITH
A AS (SELECT 1 AS N
UNION ALL
SELECT N+1 FROM A WHERE N < @C)
INSERT INTO TEST_PART(ID, COL2, COL3)
SELECT ID, COL2, COL3 FROM(
SELECT N AS ID,
'CASE' + CONVERT(NVARCHAR(10), CASE WHEN N%20 = 0 THEN 0 ELSE 1 END) AS COL2,
'D' + CONVERT(NVARCHAR(10), N, 0) AS COL3 FROM A) AS A
OPTION (MAXRECURSION 0);
SET IDENTITY_INSERT TEST_PART OFF;
Я бегу два выбирает:
SELECT * FROM TEST_PART WHERE COL2='CASE0' AND COL3='D240';
SELECT * FROM (SELECT * FROM TEST_PART WHERE COL2='CASE0') AS A WHERE COL3='D240';
Они выглядят одинаково.
Но!
FIRST имеет план выполнения со степенью параллелизма 4 и оценочную стоимость поддерева ~ 5
ВТОРАЯ имеет план выполнения со степенью параллельности 1 и оценочную стоимость поддерева ~ 2,5
Если я использую IQueryable как
query.Where(test=>test.COL2 == "CASE0")
.Where(test=>test.COL3 == "D240")
EF concatenates where clauses и генерирует запрос типа FIRST. Можно ли принудительно генерировать запрос сущности, как SECOND?
PS: Я использую EF 4.4 и MSSQL 2008 R2
С наилучшими пожеланиями,
Роман