C# 实体框架文本 SQL 查询包装器



我有一个类似的问题:如何从非实体类型的sql查询中检索多列?

我需要实现方法string[,] DirectQuery(string sqlText, string[] param)它基本上是 SQL Server Management Studio 的 C# 等效项。

用户应该输入 SQL 查询作为字符串文本(+字符串参数以避免 SQL 注入)并接收包含查询结果的字符串矩阵。

在内部,我正在使用实体框架。

这是我的实现:

public string[,] DirectQuery(string sqlQuery, string[] param)
{
        //discover how many fields are specified in the select clause
        string ip = sqlQuery.ToLower().Split(new string[] { "from" }, StringSplitOptions.None)[0];
        int cols = ip.Count(y => y == ',') + 1;
        //execute the query
        DbRawSqlQuery<string> res = param != null ? _context.Database.SqlQuery<string>(sqlQuery, param) : _context.Database.SqlQuery<string>(sqlQuery);
        //wrap everything in a matrix to return
        return res.ToArray().Array2Matrix(res.ToArray().Length /cols, cols);
    }

哪里

public static T[,] Array2Matrix<T>(this T[] flat, int rows, int cols) where T : class

是我的自定义方法,将平面数组转换为rows x cols矩阵。

如果在 select 子句中用户指定单个属性,则工作正常,但在需要 2+ 字段的情况下,执行 DirectQuery 会触发运行时异常dbrawsqlquery he data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types。这是完全合理的,但由于查询可以是我无法创建自定义类来包装每个可能的结果的任何内容。

你有什么建议?

问题是你正在使用一个方法 - DbRawSqlQuery必须告诉它期望什么类型,并且你告诉它只期望一个字符串,所以它不知道如何处理多个返回的列。

如果您指定string[]IEnumerable<string>或其他东西,也许它会起作用? 或者,您可以定义一系列具有 1、2、3、4 等值的对象,并在运行时检测项目数并使用正确的类......但这似乎很荒谬。

真的,我建议不要像上面有人建议的那样使用 EF。 找到可以返回动态对象的东西,或者直接使用 ADO.Net。

最新更新