【问题标题】:Using Fluent.NHibernate, how can I do an Insert based on a Select statement使用 Fluent.NHibernate,如何根据 Select 语句进行插入
【发布时间】:2016-07-11 12:57:59
【问题描述】:

我有一段相当复杂的逻辑,它为我生成一个IQueryable,我用它使用Fluent.NHibernate从我的数据库中返回数据。

但是,我需要能够将此查询的结果存储回数据库(实际上只是主键,但这是一个附带问题)

如何根据IQueryable 生成插入语句,我已经必须像下面生成的示例一样获取 SQL:

INSERT INTO MySavedResults (Id, FirstName, LastName)
SELECT Id, FirstName, LastName FROM Member
WHERE 
FirstName = 'John' and LastName ='Snow' and ...-- more conditions

【问题讨论】:

  • 可能是 NH 方式,使用 session.CreateSQLQuery(your_query)
  • 我考虑过,但这意味着必须复制我已有的逻辑。所以希望避免自己重新创建 SQL。

标签: c# sql-server fluent-nhibernate iqueryable


【解决方案1】:

我不确定有没有办法在 NHibernate 中直接执行此操作而不使用原始 sql。

您当然可以使用您已经拥有的IQueryable 并从此IQueryable 生成休眠实体。然后,您可以使用这些实体并结合使用 IStatelessSession 和批处理来提高大型结果集的性能。

这是一个很好的例子:

Speed up bulk insert operations with NHibernate

我还会查看其他答案以进一步提高速度。

编辑:

另一种可能的方法是使用以下方法将 linq 查询转换为原始 sql:

How can I have NHibernate only generate the SQL without executing it?

获取原始 sql 并在其前面加上您要创建的插入语句,然后使用以下方式执行此 sql:

Executing Sql statements with Fluent NHibernate

【讨论】:

  • 这正是我现在正在做的。希望有更有效的解决方案。开始认为我将不得不编写一个 NHibernate 扩展。
  • 请注意,速度不是我的问题。它是磁盘 IO 使用杀死了我的数据库正在运行的所有其他内容。
  • @DanielvanHeerden 进行了另一次编辑。没想到你已经这样做了。
  • 嗯,我去看看。我相信生成的 SQL 是参数化格式。这就是为什么我以前没有尝试过这种方法的原因。会试一试,让你知道。
  • 我之前已将此 sql 从参数化转换为非参数化以用于记录目的。见这里:stackoverflow.com/questions/11015005/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多