Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用nHibernate的CreateSQLQuery时如何保持列顺序?_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 使用nHibernate的CreateSQLQuery时如何保持列顺序?

C# 使用nHibernate的CreateSQLQuery时如何保持列顺序?,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,上下文 我正在创建一个web应用程序,它的一个特性是允许通过UI进行DB查询。对于持久性,它使用nHibernate ORM。下面是处理传入SQL查询的存储库方法: public IList ExecuteSqlQuery(string sqlQuery) { var query = Session.CreateSQLQuery(sqlQuery); var queryResult = query.SetResultTransformer(Transformers.AliasTo

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

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

    return queryResult;
}  
问题 上面的方法将返回一个字典列表,每个字典都包含具有Key=ColumnName和Value=ColumnValue的DictionaryEntry对象

这很好,只是列名的顺序与原始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"  
更新 在上面的示例中,字典的键按名称排序,但这仅适用于本示例,本示例有意保持简单。对于较大的查询,键=列没有排序

问题: 在这个contextnHibernate/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
}  
在上面的代码中,别名是列名

资料来源:

您不能将结果作为字典,因为字典不定义任何键顺序。因此,您必须将AliasToEntityMap的使用替换为构建一个数据结构的东西,该数据结构保留了IResultTransformer。若您给SortedDictionary一个内部从列名映射到列索引的比较器,它可能会工作


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

@Maxim Gershkovich 1。作为DB用户,在编写SQL查询时,您将希望按照指定的顺序获取列。2.LINQ怎么能把它修好呢?因为它们是一本字典,所以它们会在a-z中order@Rippo不是真的。这不是一本分类词典。上面的例子看起来可能很简单,但实际上并没有特别的列顺序。@Maxim Gershkovich似乎是我无意中删除了你的第一条评论。我很抱歉,对SO来说还是新手…谢谢@Florin D.Preda分享。谢谢。我使用了AliasToEntityMap,因为它是我发现的唯一一个在结果中包含列名的预制选项。如果没有其他选项,我将实现一个定制的IResultTransformer,但如果有,我宁愿使用现有的实现……AliasToEntityMap实现大约有20行代码,其中一半是样板代码,因此不必担心。其复杂性主要取决于您希望最终得到什么样的数据结构。SortedDictionary的另一种选择可能是数据集。但是,如果您将SQL查询作为输入,并希望将DataSet作为输出,那么在这个用例中使用NHibernate的好处是非常有限的,甚至是不存在的。完成:。谢谢