В памяти есть список list из 50 000 идентификаторов продуктов. Я хотел бы получить все эти продукты из БД. Использование dbContext.Products.Where(p => list.contains(p.ID))
генерирует гигантский IN в SQL - WHERE ID IN (2134,1324543,5675,32451,45735...)
, и это занимает вечность. Отчасти это связано с тем, что SQL Server требует времени для разбора такой большой строки, а также потому, что план выполнения неверен. (Я знаю это, пытаясь вместо этого использовать временную таблицу).
Поэтому я использовал SQLBulkCopy для вставки идентификаторов во временную таблицу, а затем запустил
dbContext.Set<Product>().SqlQuery("SELECT * FROM Products WHERE ID IN (SELECT ID FROM #tmp))"
Это дало хорошую производительность. Однако теперь мне нужны продукты с их поставщиками (несколько для каждого продукта). Используя пользовательскую команду SQL, нет способа вернуть сложный объект, о котором я знаю. Итак, как я могу получить продукты от их поставщиков, используя временную таблицу?
(Если бы я мог каким-то образом сослаться на временную таблицу в LINQ, тогда все было бы в порядке — я мог бы просто сделать dbContext.Products.Where(p => dbContext.TempTable.Any(t => t.ID==p.ID))
. Если бы я мог сослаться на нее в UDF, это тоже было бы хорошо — но вы не можете. Я не могу использовать реальной таблице, так как одновременные пользователи оставят ее в несогласованном состоянии.)
Спасибо
userid
в нем. - person qujck   schedule 17.10.2013