Я также хотел бы отметить, что я отправлял события через 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
});
});
Использовать ObjectContext#GetObjectByKey()
получать объекты их ключом вместо использования First()
(или FirstOrDefault
) оператор в запросе LINQ. Последний поразит базу данных каждый раз, в то время как первый будет искать кэш EF (ObjectStateManager
быть конкретным) для объекта сначала и не поразит базу данных, если объект с указанным ключом будет найден.
Ссылки
Предположите, что мы имеем BlogPost
ссылки на сущность User
объект через Author
свойство. Вместо того, чтобы указать полное User
объект к BlogPost.Author
свойство (который мог бы потребовать распространения в прямом и обратном направлениях базы данных), инициализируя ссылку с корректным EntityKey
. Например:
BlogPost.AuthorReference.EntityKey = new EntityKey("EFNamespace.User", "Id", userId);
Быстрый и простой способ обновить отсоединенные объекты объекта. Это - дополнительный метод.
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();
}
}
То, что я только что узнал при профилировании 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 <>.