C# nHibernate SQL不可用错误

C# nHibernate SQL不可用错误,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我有以下代码来执行一个简单的select语句。 由于出现“SQL不可用”错误,此查询失败。 这个与模式相同的代码在大约20个不同的模型中工作得很好。 事实上,如果我改变SQL中实现的视图的设计,说隐藏LoadID列,那么查询就会失败,说明“可以执行……因为LoadID不存在” 我的问题是,当这段代码、hbm.xml模型和视图的设计都对齐时,ses.Query()无法声明“SQL不可用” 到 重新编译,我的问题消失了 不幸的是,我将其更改为true并重新编译,但我的问题没有回来。是否有特殊原因

我有以下代码来执行一个简单的select语句。 由于出现“SQL不可用”错误,此查询失败。 这个与模式相同的代码在大约20个不同的模型中工作得很好。 事实上,如果我改变SQL中实现的视图的设计,说隐藏LoadID列,那么查询就会失败,说明“可以执行……因为LoadID不存在”

我的问题是,当这段代码、hbm.xml模型和视图的设计都对齐时,ses.Query()无法声明“SQL不可用”


重新编译,我的问题消失了


不幸的是,我将其更改为true并重新编译,但我的问题没有回来。

是否有特殊原因使您在
Select
方法中创建
vInventory
的新实例?nHibernate应该已经基于您的映射返回此类型的对象。我认为这可能会使linq提供程序作为一个构造出错或调用无法转换为SQL。linq提供程序将处理Select语句,就像它是一个普通的
IEnumerable

现在发生的是: nHibernate获取一个查询,其中只有以下内容:
。其中(c=>c.CustomerRecid==recid)
需要执行。因此,nHibernate只查询对象的ID(因为就nHibernate所知,它不需要任何其他属性)。 这将为您提供
1、2、3、4、5、
等等


一旦执行了
Select
(而不是在数据库上),nHibernate就会发现它需要其余的属性,因此它会根据它们的ID逐个查询它们(对于许多结果来说效率不是很高)。现在,您使用
行编号
作为ID,这可能很危险,因为它只考虑当前结果集。查询单个记录时,
行编号
将始终为1,因此nHibernate无法再找到其余对象。

您创建
vInv的新实例有特殊原因吗在
Select
方法中的entory
?nHibernate应该已经根据您的映射返回了这种类型的对象。我认为这可能会破坏linq提供程序,因为构造函数调用无法转换为SQL。linq提供程序将处理Select语句,就像它是一个普通的
IEnumerable
语句一样

现在发生的是: nHibernate获取一个查询,其中只有以下内容:
。其中(c=>c.CustomerRecid==recid)
需要执行。因此,nHibernate只查询对象的ID(因为就nHibernate所知,它不需要任何其他属性)。 这将为您提供
1、2、3、4、5、
等等


一旦执行了
Select
(而不是在数据库上),nHibernate就会发现它需要其余的属性,因此它会根据它们的ID逐个查询它们(对于许多结果来说效率不是很高)。现在,您使用
行编号
作为ID,这可能会很危险,因为它只考虑当前结果集。当查询单个记录时,
行编号
将始终为1,因此nHibernate无法再找到其他对象。

显示您的视图。这是一个集成了3个不同系统的CPE。它是超过500行。我不能有效地做到这一点。向我们展示你的观点。这是一个集成了3个不同系统的CPE。它超过500行。我不能有效地做到这一点。很有趣。我可以同意。但是我不能在没有编译错误的情况下重新编写语法。你如何编写它?我想
var rows=ses.Query()。在哪里(c=>c.CustomerRecid==recid).ToList();
足以为您提供所需的结果。但如果您无法更改视图,则这是不够的。然后您需要禁用此类型的延迟加载(因此nHibernate将始终检索所有属性,并且不需要往返)正如我所说,我对hbm.xml映射进行了更改,但当我将其更改回时,我不明白为什么它不起作用。但当我实现您的var rows=…时,它似乎仍能满足我的要求。这可能在一个月前的某个时间起作用。然后似乎就退出了。不知道为什么。但创建列表时没有使用redundant Select()更好。谢谢。很有趣。我也同意。但是我不能在没有编译错误的情况下重新编写该语法。您将如何编写它?我认为
var rows=ses.Query()。其中(c=>c.CustomerRecid==recid)。ToList();
足以为您提供所需的结果。但如果您无法更改视图,则这是不够的。然后,您需要禁用此类型的延迟加载(因此nHibernate将始终检索所有属性,不需要往返)正如我所说,我对hbm.xml映射进行了更改,但当我将其更改回时,我不明白为什么它不起作用。但当我实现您的var rows=…时,它似乎仍能满足我的要求。这可能在一个月前的某个时间起作用。然后似乎就退出了。不知道为什么。但创建列表时没有使用redundant Select()更好。谢谢。
var rows = ses.Query<vInventory>().Where(c => c.CustomerRecid == recid).Select(c => new vInventory()
{
    InventoryRecid = c.InventoryRecid
    , ItemID = c.ItemID
    , LoadID = c.LoadID
    , CustomerRecid = c.CustomerRecid
}).ToList();
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="Asmbly" namespace="Asmbly.Models">
  <class name ="vInventory" table="dbo.vInventory" dynamic-update="true">
    <cache usage="read-only"/>
    <id name="InventoryRecid" column="InventoryRecid" type="Int64">
      <generator class="native" />
    </id>
    <property name="ItemID" />
    <property name="LoadID" />
    <property name="CustomerRecid" />
  </class>
</hibernate-mapping>
<class name ="vInventory" table="dbo.vInventory" dynamic-update="true">
<class name ="vInventory" table="dbo.vInventory" dynamic-update="false">