0

试图通过一种将获取数据的方法进行通用 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 ..

4

3 回答 3

0

经过一段时间的测试每个可能的选项,而我没有在网上找到任何类似的代码..

这是我的解决方案,作为一种扩展方法,我是否进行了错误的搜索/研究?或者只是没有人像这样使用它,尽管扩展是针对ObjectContext它确实返回一个ObjectResult 可选参数列表的类型,用于 where 子句 + 另一个用于 order by 并且它完成了工作

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);

}

任何类型的评论都会有所帮助(嗯......几乎任何评论)

于 2013-08-31T16:56:56.003 回答
0

我想你需要这样的东西

    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();
    }

按照这个链接

于 2013-08-30T02:01:08.570 回答
0

为什么不考虑将一组 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”; custIDlastActiveDate应该通过 SqlParameter 集合 (filterParams) 传递

于 2013-08-30T02:04:41.077 回答