Я разрабатываю сервис, который использует данные CRM 2011 через динамические объекты (например, Microsoft.Xrm.Sdk.Entity, метод позднего связывания). Я намеренно не использую метод Xrm.cs (ранняя привязка), пытаясь сохранить общее решение.
Кроме того, я хочу избежать прямого подключения к базе данных CRM (например, EDMX), поскольку это помешает использованию моего решения для размещенной CRM (например, без прямого доступа к БД).
У меня есть следующее (упрощенное) требование, я действительно борюсь с критериями выбора:
случайные 7% записей должны быть выбраны (и обновлены).
В SQL критерии выбора были бы относительно просты — я знаю, как выбрать случайный процент записей. Что-то типа:
SELECT TOP 7 PERCENT * FROM
(
SELECT TOP 1000 NEWID() AS Foo, [someColumns]
FROM [someTable]
)
AS Bar ORDER BY Bar.Foo ASC
Это работает отлично. Я понимаю, что эквивалент LINQ выглядит примерно так:
from e in someEntities
orderby Guid.NewGuid()
select e;
Однако есть проблема: я не знаю, как использовать LINQ с динамическими объектами CRM 2011 — вместо этого они настаивают на использовании либо некоторых ограничительных классов/синтаксиса QueryExpression, либо fetchXML, как показано на эта страница (MSDN).
Я определил следующие варианты выполнения этого требования:
Используя динамические объекты, верните весь набор записей в список, а затем просто выберите случайный выбор по индексу. Однако это требует возврата до 10 000 записей через службу передачи данных в Интернете, что может быть медленным, небезопасным и т. д.
Используйте оператор fetchXML. К сожалению, я не знаю fetchXML, поэтому не знаю, можно ли делать такие вещи, как COUNT, TOP, PERCENT или NEWID().
Используйте Xrm.cs и LINQ, хранимую процедуру или представление SQL. Все эти варианты означают привязку решения либо к прямому подключению к базе данных, либо к раннему связыванию, что нежелательно.
Скажите клиенту «нет».
Любой совет будет принят с благодарностью! Может ли fetchXML выполнить этот запрос? Есть лучший способ сделать это?