Универсальный помощник для получения ObjectResult<T>, который будет соответствовать любому данному EntityObject
Пытаясь сделать общий SQL-запрос с помощью метода, который будет извлекать данные, которые я делал этот код
public ObjectResult<theSelectedTableNameModel> getUsersRes(string sqlStr, string ColNameAsfilter, string FiltersValue,string OrderByFilter="")
{
string SqlCmd = "";
string By = "";
if (OrderByFilter.isNotEmptyOrNull())
By = string.Concat(" ORDER BY ", OrderByFilter);
SqlCmd = string.Format("{0} WHERE {1}={2}{3}", SqlStr, ColNameAsfilter, FiltersValue, By);
return anEntityName.ExecuteStoreQuery<theSelectedTableNameModel>(SqlCmd);
}
Я скопировал свой код и отредактировал реальные имена и другие переменные / параметры, чтобы я мог ошибиться, но вопрос в том, как я могу сделать его более общим, чем этот?
это рабочий подход, который позволяет мне указать запрос sqlCommand
я хотел, чтобы он подходил для любой сущности и любой модели / объекта / таблицы
как это можно сделать? Я думаю, что есть готовое решение для этого или зародыш EF не ментальный, чтобы быть универсальным... Я использую asp.net 4.0, и последний EF..
3 ответа
Я думаю, тебе нужно что-то подобное
public List<T> Get(System.Linq.Expressions.Expression<Func<T, bool>> filter = null)
{
IQueryable<T> query = dbSet.AsQueryable();
if (filter != null)
{
query = query.Where(filter);
}
return query.ToList();
}
Перейдите по этой ссылке
Почему бы не рассмотреть возможность передачи коллекции параметров SQL в вызов функции в качестве параметра. Как только вы это сделаете, вы можете использовать любое количество фильтров нескольких типов
public ObjectResult<theSelectedTableNameModel> GetEntityBySQLCommand(string sqlStr, SqlParameter[] filterParams, string OrderByFilter="")
{
var commandTextToExecute = OrderByFilter.isNotEmptyOrNull() ? sqlStr : string.Format(“{0} Order By {1}”, sqlStr, OrderByFilter);
return yourObjectContext.ExecuteStoreQuery<theSelectedTableNameModel>(commandTextToExecute, filterParams);
}
Ваш sqlStr должен выглядеть примерно так “SELECT * FROM Customer WHERE CustId = @custID and LastActiveOn = @lastActiveDate”;
custID и lastActiveDate должны быть переданы через коллекцию SqlParameter (filterParams)
После некоторого времени тестирования каждого возможного варианта, пока я не нашел подобного кода в сети..
это мое решение, как метод расширения, я провел плохой поиск / исследование? или просто никто не использует это так, хотя расширение для типа ObjectContext
это возвращает ObjectResult
список необязательных параметров для условия where + другой для заказа, и это делает работу
string firstPartSql="SELECT * FROM YourTblName";
список строк для фильтра WHERE будет содержать такие элементы, как
"columnName=value", "columnName Like '%val%'"
список строк для Order by будет содержать такие элементы, как
"ColumnName" ,"ColumnName DESC"
public static ObjectResult<T> getUsersResStatic<T>(this ObjectContext Entt, string sqlBeginhing, List<string> LstSelectWhersFilter = null, List<string> LstOby = null)
{
string SqlCmd = "";
string StrWhereFilterPrefix = "";
string StrFinalWHEREFiter ="";
string StrKeyOb1 = "";
string StrKeyOb2 = "";
string StrFinalOrderBy = "";
if (LstSelectWhersFilter != null)
{
StrWhereFilterPrefix = "WHERE";
for (int CountWhers = 0; CountWhers < LstSelectWhersFilter.Count; CountWhers++)
{
if (CountWhers == 0) StrFinalWHEREFiter = string.Format(" {0} {1} ", StrWhereFilterPrefix, LstSelectWhersFilter.ElementAt(CountWhers));
else
{
StrWhereFilterPrefix = "AND";
StrFinalWHEREFiter += string.Format(" {0} {1} ", StrWhereFilterPrefix, LstSelectWhersFilter.ElementAt(CountWhers));
}
}
}
if (LstOby != null)
{
StrKeyOb1 = "ORDER BY";
if (LstOby.Count > 1)
{
StrKeyOb2 = ",";
for (int i = 0; i < LstOby.Count; i++)
{
if (i == 0) StrFinalOrderBy = string.Format("{0} {1}", StrKeyOb1, LstOby.ElementAt(i));
else
StrFinalOrderBy += string.Format("{0} {1}", StrKeyOb2, LstOby.ElementAt(i));
}
}
else StrFinalOrderBy = string.Format("{0} {1}", StrKeyOb1, LstOby.ElementAt(0));
SqlCmd = string.Format("{0} {1} {2}", sqlBeginhing, StrFinalWHEREFiter, StrFinalOrderBy);//StrKeyOb2, ob2);
}
if (LstSelectWhersFilter == null && LstOby == null) SqlCmd = sqlBeginhing;
return Entt.ExecuteStoreQuery<T>(SqlCmd);
}
любые комментарии будут полезны (ну... почти любые)