【问题标题】:Entity Framework Raw SQL query selecting unknown columns (unknown return type)实体框架原始 SQL 查询选择未知列(未知返回类型)
【发布时间】:2015-07-27 16:42:49
【问题描述】:

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

该场景是页面根据用户选择的选项动态生成 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();

但我无法找到一种方法来处理任何其他数量的列 - 我试过 &lt;string[]&gt;IEnumerable&lt;string&gt;

我最后的想法是提取整组列并在事后将其过滤为我需要的内容,但这似乎很浪费。有没有更好的解决方案?

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

谢谢!

【问题讨论】:

  • 不幸的是,我不认为 EF 是为这种情况而构建的。在我看来,可能是时候使用一个好的老式 DataReader 了。 叹息...

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


【解决方案1】:

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

但即使它有效,我也强烈建议不要这样做,即使您使用参数,构建这样的查询也是可怕的。正常映射实体并使用 LINQ to Entities 为您生成查询要好得多。

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

【讨论】:

  • 谢谢 - 我认为你的权利,动态生成一个类可能会在进一步操作时引入更多问题。我会全力以赴,而不是 James 提出的(也很好的)数据阅读器建议来保留数据类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2011-02-20
  • 2016-05-20
  • 1970-01-01
相关资源
最近更新 更多