Подсказки по производительности платформы объектов ADO.NET каждый разработчик должны знать [закрытый]

Я также хотел бы отметить, что я отправлял события через Splunk SDK.

Чтобы получить поля, которые я хотел показать в событии, я должен был представить данные события в качестве имени события.

    var myindexes = service.indexes();
    // Submit an event to the index
    myindexes.fetch(function (err, myindexes) {
    let myindex = myindexes.item("audits-client");


    let evtData = {
        timestamp: Date.now(),
        userAgent: headers['user-agent'],
        protocol: "http",
        file: "null"
    }

    myindex.submitEvent(evtData, {

        sourcetype: "web"

    }, function (err, result, myindex) {
        console.log("Submitted event: ", result);
        return result
    });
});
10
задан Chris Pietschmann 7 September 2011 в 20:11
поделиться

4 ответа

Использовать ObjectContext#GetObjectByKey() получать объекты их ключом вместо использования First() (или FirstOrDefault) оператор в запросе LINQ. Последний поразит базу данных каждый раз, в то время как первый будет искать кэш EF (ObjectStateManager быть конкретным) для объекта сначала и не поразит базу данных, если объект с указанным ключом будет найден.

Ссылки

9
ответ дан 3 December 2019 в 18:02
поделиться

Предположите, что мы имеем BlogPost ссылки на сущность User объект через Author свойство. Вместо того, чтобы указать полное User объект к BlogPost.Author свойство (который мог бы потребовать распространения в прямом и обратном направлениях базы данных), инициализируя ссылку с корректным EntityKey. Например:

BlogPost.AuthorReference.EntityKey = new EntityKey("EFNamespace.User", "Id", userId);
4
ответ дан 3 December 2019 в 18:02
поделиться

Быстрый и простой способ обновить отсоединенные объекты объекта. Это - дополнительный метод.

public static void AttachUpdated(this ObjectContext obj, EntityObject objectDetached)
{
    if (objectDetached.EntityState == EntityState.Detached)
    {
        object original;
        if (obj.TryGetObjectByKey(objectDetached.EntityKey, out original))
            obj.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);
        else
            throw new ObjectNotFoundException();
    }
}
1
ответ дан 3 December 2019 в 18:02
поделиться

То, что я только что узнал при профилировании SQL-запросов, сгенерированных кодом EF, используемым в моем приложении: существует разница между:

IEnumerable<User> users = DB.User.Where(...);
int count = users.Count();

и

IQueryable<User> users = DB.User.Where(...);
int count = users.Count();

Первый генерирует полный запрос для извлекать совпавшие строки из таблицы User , и подсчет выполняется после того, как данные были переданы обратно в EF. Последний делает то, что обычно ожидается: генерирует SELECT COUNT ... SQL, который намного эффективнее.

Это довольно тонко, но нетрудно понять, почему, заметив об этом: это связано со статически связанной природой метода расширения C #.

Небольшой способ обойти это - использовать ключевое слово "var" для объявить переменную:

var users = DB.users.Where(...);
int count = users.Count();

Это приведет к тому, что «пользователи» будут объявлены с тем же типом, что и «.Where»; который является IQueryable <>.

8
ответ дан 3 December 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: