admin

实体框架原始SQL查询选择未知列(未知返回类型)

sql

当我不知道需要返回的类型时,无法对实体数据集运行原始sql。

场景是该页面根据用户选择的选项(生成语句的“ Select”和“ Where”部分)动态生成sql,然后尝试使用以下命令将其拉出:

        string sSQL = "SELECT " + sSelect + " FROM dbo.Staff ";

        if (!string.IsNullOrWhiteSpace(sWhere)) { sSQL += "WHERE " + sWhere; }

        DAL.AcdmContext ds = new DAL.AcdmContext();
        var resultSet = ds.Database.SqlQuery(sSQL).ToList();

似乎不能为结果集使用匿名类型。问题在于,由于select语句是即时生成的,因此我无法预先为结果集生成类或类似的类-组合太多。

我可以对每一列进行查询,也可以对一列进行查询

        var resultSet = ds.Database.SqlQuery<string>(sSQL).ToList();

但我不能找到一种方法,与列的任何其他号码做到这一点-我已经试过为<string[]>IEnumerable<string>

我的最后一个想法是提取整个列并将其过滤到我需要的事实之后,但这似乎很浪费。有更好的解决方案吗?

(哦,在有人说之前,我知道我应该在查询中使用参数-我暂时将它们取出来尝试使其正常工作)

谢谢!


阅读 226

收藏
2021-06-07

共1个答案

admin

可能有一种可能的解决方案以您尝试执行http://www.codeproject.com/Articles/206416/Use-dynamic-
type-in​​-Entity-Framework-
SqlQuery的方式进行查询

但是即使它起作用了,我还是强烈建议不要这样做,即使使用params,构建这样的查询也是很糟糕的。更好的方法是将实体正常映射并使用LINQ to
Entities来为您生成查询。

是的,它将带来您不需要的列,但是除非您选择成千上万的记录,否则它可能不会对性能产生很大影响,并且如果可能的话,它将对实体产生更好的(并且更易于维护的)代码和linq我没记错,请注意像Sql
Injection这样的安全性问题

2021-06-07