8

我正在尝试按照以下方式生成 SQL:

SELECT 
  t.*, 
  SELECT (...)
FROM Title t
[trimmed]

使用 QueryOver

Title title = null;

var q = session
   .QueryOver(() => title)
   .Select(
      Projections.Alias(Projections.Property<Title>(t => t.Id), "Id"),
      Projections.Alias(Projections.Property<Title>(t => t.Name), "Name"),
      ....
      Projections.SubQuery(sq.Where(tt => tt.Id == title.Id))), "TopLevelGenre")
)
[code trimmed]

我要投影的 ​​Title 中有 15 个属性。有没有更简单的方法,这样我就不必像上面开始做的那样单独投影每个属性?

4

7 回答 7

3

如果你不介意 ICriteria,这行得通。我已经使用 2.1.2 进行了测试,但我不明白为什么如果不能使用 3.x。

var projectionList = Projections.ProjectionList();
var metadata = session.SessionFactory.GetClassMetadata(typeof(Title));
foreach (var name in metadata.PropertyNames)
{
    projectionList.Add(Projections.Property(name), name);
}
var criteria = DetachedCriteria.For<Title>()
   .SetProjection(projectionList)
   ...;
于 2011-11-07T17:20:05.220 回答
2

I've discovered that as of NHibernate 3.2, this is not possible without manually enumerating all of the properties.

于 2011-06-28T17:38:47.110 回答
1

如果不手动枚举所有属性,就不可能做到这一点。我通常使用 CodeSmith 来生成投影代码。

于 2012-03-10T02:05:55.533 回答
0

是否可以在标题表上创建一个包含您感兴趣的列的视图?或者也许您可能想尝试将 Title 类的属性拆分为两个类(TitleBase 类和继承自 TitleBase 类的 Title 类)。因此,您需要创建两个单独的映射文件。

假设您感兴趣的所有属性都在 TitleBase 类中,然后在上述查询中使用它。

于 2011-04-25T09:36:56.727 回答
0

如果你想要 Title 对象,你可以写:

IList<Title> list = session.QueryOver<Title>.Where(/*some condition*/).List();  

nHibernate 将为您填充所有 Title 属性。
请参阅此处了解更多详细信息。

于 2011-04-24T23:07:08.057 回答
0

我已经用这段代码解决了。我希望它能为你服务。我只使用 Bags,如果您需要使用 ISet,只需更改比较即可。PDM 是我在其属性上应用反射的实体。您可以将此方法更改为通用方法。

        ProjectionList list = Projections.ProjectionList();            
        var metadata = session.SessionFactory.GetClassMetadata(typeof(PDM));

        foreach (var name in metadata.PropertyNames)
        {
            PropertyInfo property = typeof(PDM).GetProperties(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(x => x.Name.Equals(name));
            FieldInfo field = typeof(PDM).GetFields(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(x => x.Name.Equals(name));

            if (property != null)
            {
                if (!property.PropertyType.Name.Contains("IList"))
                {
                    list.Add(Projections.Property(name), name);
                }
            }

            if (field != null)
            {
                if (!field.FieldType.Name.Contains("IList"))
                {
                    list.Add(Projections.Property(name), name);
                }
            }
        }          
于 2013-10-14T10:45:14.567 回答
0

在 NHibernate 5.1 中可以通过实体投影

Title title = null;

var q = session
   .QueryOver(() => title)
   .Select(
      Projections.Entity(() => title),
      Projections.SubQuery(sq.Where(tt => tt.Id == title.Id))), "TopLevelGenre")
)
于 2018-04-19T05:17:47.570 回答