当我不知道需要返回的类型时,无法对实体数据集运行原始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>
<string[]>
IEnumerable<string>
我的最后一个想法是提取整个列并将其过滤到我需要的事实之后,但这似乎很浪费。有更好的解决方案吗?
(哦,在有人说之前,我知道我应该在查询中使用参数-我暂时将它们取出来尝试使其正常工作)
谢谢!
可能有一种可能的解决方案以您尝试执行http://www.codeproject.com/Articles/206416/Use-dynamic- type-in-Entity-Framework- SqlQuery的方式进行查询
但是即使它起作用了,我还是强烈建议不要这样做,即使使用params,构建这样的查询也是很糟糕的。更好的方法是将实体正常映射并使用LINQ to Entities来为您生成查询。
是的,它将带来您不需要的列,但是除非您选择成千上万的记录,否则它可能不会对性能产生很大影响,并且如果可能的话,它将对实体产生更好的(并且更易于维护的)代码和linq我没记错,请注意像Sql Injection这样的安全性问题