Entity Framework - CreateQuery VS ExecuteFunction VS ExecuteStoreQuery VS ExecuteStoreCommand

Каковы различия между следующими -

CreateQuery()  ExecuteFunction(), ExecuteStoreQuery() and ExecuteStoreCommand() 

В соответствии с моими знаниями CreateQuery используется для Entity SQL, а остальные методы используются для функции sql или хранимой процедуры, определенной в DB.

В соответствии с метаданными класса ObjectContext они следующие:

CreateQuery():Creates an System.Data.Objects.ObjectQuery<T> in the current object context        by using the specified query string. 
Returned -> System.Data.Objects.ObjectQuery<T>


ExecuteFunction(): Executes a stored procedure or function that is defined in the data source and expressed in the conceptual model; discards any results returned from
the function; and returns the number of rows affected by the execution.
Returned -> The number of rows affected.
This has an overloaded version which return -> The entity type of the System.Data.Objects.ObjectResult<T> 


ExecuteStoreCommand(): Executes an arbitrary command directly against the data source using the existing connection.
Return -> The number of rows affected.


ExecuteStoreQuery(): Executes a query directly against the data source that returns a sequence of typed results.
Return -> An enumeration of objects of type TResult.

В соответствии с приведенной выше информацией -

Use ExecuteFunction() if you have added db Function/Stored Procedure in your EDMX & can be used for both insert/update & getting result set.

Use ExecuteStoredCommand() if you have not added db Function/Stored Procedure in your EDMX & can be used to insert/update only.

ExecuteStoreQuery() can do what Executefuction() can do except that you no need to add your db Function/Stored Procedure in EDMX & IEnumerable can be used as return type.

Пожалуйста, поправьте меня, если я ошибаюсь. Любая дополнительная информация будет высоко оценена.

Ответ 1

Очень похоже на CreateQuery:

var id = 42;
using(var ctx = new Entities()){
  var query = ctx.Companies.Where(o=>o.Id==id);
  var result = query.First();
}

Прежде чем я вызову First() - это просто запрос. В базу данных ничего не отправлено. Только когда запрашиваются данные, запрос будет выполнен и извлечены данные.

Письмо лямбда прост, но, допустим, вы можете принести в жертву то, что принесет другие выгоды. Если EDMX не знает о вашем сопоставлении данных, вы в основном можете использовать ExecuteStoreQuery. Ex. вы вручную создали сопоставление.

var queryString = "SELECT ... FROM " + tableName;
var table = context.ExecuteStoreQuery<ResultTableTemplate>(queryString );

Написание кода для вашего приложения в порядке, но иногда база данных переживает несколько пользовательских интерфейсов. Чтобы минимизировать объем требуемой работы, вы можете сохранить некоторые, если не все функциональные возможности в базе данных. Их можно хранить там главным образом в виде функций или процедур.

enter image description here

ExecuteFunction предназначен только для импорта функций. Функции являются вычисленными значениями и не могут выполнять постоянные экологические изменения для SQL Server (т.е. Не разрешены инструкции INSERT или UPDATE). Чтобы вызвать пользовательскую функцию Select Today() в С#:

var date = ctx.ExecuteFunction<DateTime>("Today").First();

Entity Framework поддерживает три способа загрузки связанных данных - загружаемая загрузка, ленивая загрузка и явная загрузка. По умолчанию это ленивая загрузка, поэтому вы видите, что я использую .First()/. FirstOrDefault/.ToList/... для получения дополнительной информации о том, как загружать данные по мере необходимости, вы можете взять посмотрите Загрузка связанных объектов.

Процедуры похожи на сценарии пакетной обработки базы данных. Если вы используете базовый проект базы данных, то, скорее всего, большая часть вашей бизнес-логики будет храниться в процедурах. Вы бы назвали их в С#, например:

var cmdText = "[DoStuff] @Name = @name_param, @Age = @age_param";
var @params = new[]{
   new SqlParameter("name_param", "Josh"),
   new SqlParameter("age_param", 45)
};

ObjectContext.ExecuteStoreQuery<MyObject>(cmdText, @params);

Бонус:

Одна общая вещь, которую вы хотели бы сделать, - вызвать хранимую процедуру, которая принимает параметр значения таблицы.