当我不知道需要返回的类型时,我在对实体数据集运行原始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();
似乎它不能对结果集使用匿名类型。问题是因为select语句是动态生成的,所以我不能事先为结果集生成类或类似的东西 - 组合太多了。
我可以通过
提取每列的查询或一列 var resultSet = ds.Database.SqlQuery<string>(sSQL).ToList();
但我找不到使用任何其他数量的列进行此操作的方法 - 我已尝试<string[]>
和IEnumerable<string>
我最后的想法是拉出整组列并将其过滤到我事后需要的东西,但这看起来很浪费。有更好的解决方案吗?
(哦,在任何人说之前,我知道我应该在查询中使用参数 - 我暂时把它们拿出来尝试让它工作)
谢谢!
答案 0 :(得分:1)
可能有一种解决方案可以按照您尝试http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery
的方式进行查询但即使它有效,我也会认真反对它,即使你使用params,建立这样的查询也是可怕的。最好只是正常映射实体并使用LINQ to Entities为您生成查询。
是的,它会带来您不需要的列,但除非您选择数千或数百万条记录,否则它可能不会对性能产生太大影响,并且它将更好(并且更易于维护)代码和实体的linq如果我没弄错的话,请注意像Sql Injection这样的安全问题