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

时间:2015-07-27 16:42:49

标签: c# sql asp.net sql-server entity-framework

当我不知道需要返回的类型时,我在对实体数据集运行原始sql时遇到问题。

该方案是页面根据用户选择的选项动态生成sql(构建'选择'以及' Where'部分语句) 然后尝试使用:

来拉动它们
        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();

似乎它不能对结果集使用匿名类型。问题是因为s​​elect语句是动态生成的,所以我不能事先为结果集生成类或类似的东西 - 组合太多了。

我可以通过

提取每列的查询或一列
        var resultSet = ds.Database.SqlQuery<string>(sSQL).ToList();

但我找不到使用任何其他数量的列进行此操作的方法 - 我已尝试<string[]>IEnumerable<string>

我最后的想法是拉出整组列并将其过滤到我事后需要的东西,但这看起来很浪费。有更好的解决方案吗?

(哦,在任何人说之前,我知道我应该在查询中使用参数 - 我暂时把它们拿出来尝试让它工作)

谢谢!

1 个答案:

答案 0 :(得分:1)

可能有一种解决方案可以按照您尝试http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery

的方式进行查询

但即使它有效,我也会认真反对它,即使你使用params,建立这样的查询也是可怕的。最好只是正常映射实体并使用LINQ to Entities为您生成查询。

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