繁体   English   中英

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

[英]C# Entity Framework text SQL query wrapper

我有一个与此类似的问题: 如何从非实体类型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 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM