общий помощник для получения 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..


person Avia Afer    schedule 30.08.2013    source источник


Ответы (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();
    }

Перейдите по этой ссылке.

person Nilesh    schedule 30.08.2013

почему бы не рассмотреть возможность передачи набора параметров 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)

person Chintana Meegamarachchi    schedule 30.08.2013

после некоторого времени тестирования всех возможных вариантов, пока я не нашел подобного кода в сети..

это мое решение, как метод расширения, я провел плохой поиск/исследование? или просто никто не использует его таким образом, хотя расширение предназначено для типа 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);

}

любой комментарий будет полезен (ну... почти любой)

person Avia Afer    schedule 31.08.2013