Entity Framework скомпилированный запрос - PullRequest
4 голосов
/ 16 марта 2012

Как мне написать этот LINQ-запрос Entity Framework как скомпилированный запрос?

var context = new SlxDbContext();
var userSet = context.Set<User>();
User user = userSet.Where(x => x.UserName == "gstrader").First();

Ответы [ 2 ]

5 голосов
/ 16 апреля 2013

Нет способа использовать CompiledQuery, когда вы используете DbContext API; CompiledQuery работает только с ObjectContext. Если вы используете Code First, вы, скорее всего, используете API DbContext. И Microsoft рекомендует использовать API DbContext в новых проектах, даже если вы будете работать с моделями Database First или Model First.

Но если вы используете EF5 , он приносит автоматически скомпилированных запросов , которые работают совсем не так, как CompiledQuery. Вместо того, чтобы писать код для компиляции каждого запроса, а затем вызывать его по мере необходимости, EF5 кэширует сгенерированный для вас SQL-запрос как фоновый процесс, а затем выполняет поиск в кеше уже скомпилированных запросов при выполнении любого запроса.

См:

http://blogs.msdn.com/b/adonet/archive/2012/02/14/sneak-preview-entity-framework-5-0-performance-improvements.aspx

и

http://www.devproconnections.com/article/entity-framework/entity-framework-5-143875

2 голосов
/ 16 марта 2012

К сожалению, версия EF, которую вы используете ( сначала код ), не поддерживает скомпилированные запросы.

Пожалуйста, исправьте меня, если я ошибаюсь.

Некоторые ссылки:

Как предварительно скомпилировать Entity Framework Query-First Query?

EF Code First DbContext и скомпилированные запросы

http://blogs.msdn.com/b/adonet/archive/2011/03/02/ef-4-1-is-coming-dbcontext-api-amp-code-first-rtw.aspx

ОБНОВЛЕНИЕ:

Вот пример для скомпилированных запросов, но я думаю, что он не будет работать с Code First:

public static Shop CompiledGetShopById(Guid shopId)
{
    using (DataContext dtx = new DataContext(ConfigProvider.ConnectionString)) {
        return Compiled_GetById.Invoke(dtx, shopId);
    }

}

private static Func<DataContext, Guid, Shop> Compiled_GetById = 
    Objects.CompiledQuery.Compile<DataContext, Guid, Shop>(
        (DataContext db, Guid shopId) => 
            (from item in db.Shops where item.ShopId == shopId)
            .FirstOrDefault()
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...