NHibernate - 使用包含NULL值的value对象进行查询

时间:2016-06-16 10:26:36

标签: nhibernate

我有一个像这样的值对象:

public class PersonMapping : ComponentMap<Person>
{
    public PersonMapping()
    {
        Map(x => x.FirstName).Not.Nullable().Length(96);
        Map(x => x.LastName).Not.Nullable().Length(96);
        Map(x => x.MiddleName).Nullable().Length(96);
        Map(x => x.NickName).Nullable().Length(64);
    }
}

我创建了一个类似的查询:

var owner = new Person("Anneliese", "ObjectOfficer_1");
var query = NhSession.Query<ServiceContract>()
                .Where(s => s.ObjectOfficer.Manager == owner);
contracts = query.ToList();

这会创建一个Person的实例,其中包含null MiddleName和昵称。 NHibernate创建一个如下查询:

select .....
from .....
where (objectoffi1_.FirstName = @p0 
      and objectoffi1_.LastName = @p1 
      and objectoffi1_.MiddleName = @p2 
      and objectoffi1_.NickName = @p3);
  @p0 = 'Anneliese' [Type: String (4000)], 
  @p1 = 'ObjectOfficer_1' [Type: String (4000)], 
  @p2 = NULL [Type: String (4000)], 
  @p3 = NULL [Type: String (4000)]

没有记录匹配错误。

当我更改生成的查询并用如下值替换参数时:

...
where (objectoffi1_.FirstName = 'Anneliese' and objectoffi1_.LastName = 'ObjectOfficer_1' 
and objectoffi1_.NickName is null and objectoffi1_.MiddleName is null)

它会返回正确数量的结果。有谁知道如何处理这个?如果NHibernate将 field = NULL 字段为空发送到MS SQL Server,则不会返回任何结果,因为它是错误的TSQL 。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

事实证明,不可能在where子句中放置具有可空属性的值对象。您必须在代码中自己关心这些潜在的空值。一旦你逐字段直接比较字段就可以了。这里正确的&#39;版本:

In[1]: import pandas as pd

In[2]: import numpy as np

In[3]: datapoints = 365 * 24 * 12

In[4]: data = pd.DataFrame({"Data": np.random.randn(datapoints)}, index=pd.date_range(start="2015-01-01", freq="5min", periods=datapoints))

In[5]: data = data.between_time("07:00", "18:00")

In[6]: data["Date"] = data.index.date

In[7]: data["Time"]  = data.index.time

In[8]: data[:4]
Out[8]: 
                         Data        Date      Time
2015-01-01 07:00:00  0.890659  2015-01-01  07:00:00
2015-01-01 07:05:00 -0.643869  2015-01-01  07:05:00
2015-01-01 07:10:00  0.267501  2015-01-01  07:10:00
2015-01-01 07:15:00  0.627690  2015-01-01  07:15:00

In[9]: data = data.pivot(index="Time", columns="Date", values="Data")

In[10]: data.iloc[:, 0:4].plot(subplots=True)
Out[10]: 
array([<matplotlib.axes._subplots.AxesSubplot object at 0x1213316d0>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x1214b3e90>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x120fa7350>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x11eb6bf10>], dtype=object)

我认为这不仅仅是不方便而且我不知道其他ORM如EF是否有同样的问题。值对象是DDD的重要构建块。