gpt4 book ai didi

c# - 使用 nHibernate 的 CreateSQLQuery 时如何保留列顺序?

转载 作者:太空狗 更新时间:2023-10-29 23:40:07 26 4
gpt4 key购买 nike

上下文
我正在创建一个 Web 应用程序,其功能之一是允许通过 UI 进行数据库查询。对于持久性,它使用 nHibernate ORM。下面是处理传入 SQL 查询的存储库方法:

public IList ExecuteSqlQuery(string sqlQuery)
{
var query = Session.CreateSQLQuery(sqlQuery);
var queryResult = query.SetResultTransformer(Transformers.AliasToEntityMap).List();

return queryResult;
}

问题
上面的方法将返回一个字典列表,每个字典包含具有 Key=ColumnNameValue=< 的 DictionaryEntry 对象em>列值。

这一切都很好,只是列名的顺序与原始 SQL 查询中指定的顺序不同。例如,以下 SQL 查询:

select FirstName, LastName, c.Name   
from SoftwareDeveloper sf
join Certification c on sf.SoftwareDeveloperId = c.SoftwareDeveloperId

,为每一行返回类似的东西:

["FirstName"] = "John"
["Name"] = "70-515 MCTS, .NET Framework 4, Web Applications"
["LastName"] = "Doe"

请注意,列的顺序没有保留。应该是:

["FirstName"] = "John"  
["LastName"] = "Doe"
["Name"] = "70-515 MCTS, .NET Framework 4, Web Applications"

更新在上面的例子中,字典的键是按名字排序的,但这只适用于这个例子,它有意保持简单。对于较大的查询,键(=列)未排序。

问题
在这种情况下(nHibernate/CreateSQLQuery),如何保留原始查询中指定的列顺序?

更新#2
解决方案
通过创建 IResultTransformer 的以下自定义实现解决:

public class DictionaryResultTransformer : IResultTransformer
{
#region IResultTransformer Members
public IList TransformList(IList collection)
{
return collection;
}

public object TransformTuple(object[] tuple, string[] aliases)
{
var result = new Dictionary<string, object>();
for (int i = 0; i < aliases.Length; i++)
{
result[aliases[i]] = tuple[i];
}
return result;
}
#endregion
}

在上面的代码中,别名是列名。

来源:
Is it possible for nhibernate to return a query as an IDictionary instead of an entity class?
https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs

最佳答案

您不能将结果作为字典,因为它们没有定义任何键顺序。因此,您必须将 AliasToEntityMap 的使用替换为构建保留排序的数据结构的内容(实现 IResultTransformer)。如果您为 SortedDictionary 提供一个在内部将列名映射到列索引的比较器,它可能会起作用。

请注意,如果您直接调用 List() 而不使用结果转换器,您应该得到一个对象数组列表,其中元素的顺序遵循 select 子句中指定的顺序。

关于c# - 使用 nHibernate 的 CreateSQLQuery 时如何保留列顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13776666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com