Мы обнаружили, что компиляция наших запросов Linq намного быстрее, чем их приходится собирать каждый раз, поэтому мы хотели бы начать используя скомпилированные запросы. Проблема в том, что он делает код более трудным для чтения, потому что фактический синтаксис запроса отключен в другом файле, вдали от того, где он используется.
Мне пришло в голову, что может быть возможно написать метод (или метод расширения), который использует отражение, чтобы определить, какие запросы передаются, и кэшировать скомпилированные версии автоматически для использования в будущем.
var foo = (from f in db.Foo where f.ix == bar select f).Cached();
Cached()
должен был бы отражать переданный объект запроса и определять выбранные таблицы и типы параметров для запроса. Очевидно, что отражение немного медленное, поэтому было бы лучше использовать имена для объекта кеша (но вам все равно придется использовать отражение в первый раз для компиляции запроса).
var foo = (from f in db.Foo where f.ix == bar select f).Cached("Foo.ix");
Есть ли у кого-нибудь опыт в этом, или знаете, возможно ли это?
UPDATE:. Для тех, кто этого не видел, вы можете скомпилировать запросы LINQ к SQL со следующим кодом:
public static class MyCompiledQueries
{
public static Func<DataContext, int, IQueryable<Foo>> getFoo =
CompiledQuery.Compile(
(DataContext db, int ixFoo) => (from f in db.Foo
where f.ix == ixFoo
select f)
);
}
То, что я пытаюсь сделать, это иметь кэш этих объектов Func<>
, которые я могу вызвать после автоматической компиляции запроса в первый раз.