Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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/2/.net/21.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#_.net_Nhibernate - Fatal编程技术网

C# NHibernate:如何使用CreateSQLQuery返回标量值列表(来自一列)?

C# NHibernate:如何使用CreateSQLQuery返回标量值列表(来自一列)?,c#,.net,nhibernate,C#,.net,Nhibernate,调用返回具有ISession对象的标量值列表(在我的例子中是int)的本机SQL的最佳/最干净的方法是什么 我正在尝试运行以下操作,但总是出现一些错误: var query = _session.CreateSQLQuery("SELECT Id FROM SomeTable"); A. var ids = query.List<int>(); // <-- throws ArgumentNullException "Value cannot be null.\r\nPara

调用返回具有ISession对象的标量值列表(在我的例子中是int)的本机SQL的最佳/最干净的方法是什么

我正在尝试运行以下操作,但总是出现一些错误:

var query = _session.CreateSQLQuery("SELECT Id FROM SomeTable");

A. var ids = query.List<int>(); // <-- throws ArgumentNullException "Value cannot be null.\r\nParameter name: item"
B. var ids = query.List(); returns one element array with no valid information.
C. query.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean<int>());
var ids = query.List<int>(); // throws PropertyNotFoundException: "Could not find a setter for property 'Id' in class 'System.Int32'"
var query=\u session.CreateSQLQuery(“从SomeTable中选择Id”);

A.var id=query.List();// 当您从
CreateSQLQuery
调用
List
时,您将得到
IList
的一个实例,它在内部是一个
列表
。如果此结果的值为空,则无法转换为
int
,因为它是一种值类型。因此,解决方案是迭代结果,并在结果为有效整数时进行转换。对于示例:

var values = _session.CreateSQLQuery("SELECT Id FROM SomeTable").List();
var ids = new List<int>();

foreach (var item in values)
{
   if (item != null)
      ids.Add(Convert.ToInt32(item));
}
var ids = session.Query<SomeEntity>().Select(x => x.Id).ToList();
var values=\u session.CreateSQLQuery(“从SomeTable中选择Id”).List();
var id=新列表();
foreach(值中的var项)
{
如果(项!=null)
添加(转换为32(项目));
}
如果这是nhibernate作用域上的映射表,则可以使用LINQ执行此操作,例如:

var values = _session.CreateSQLQuery("SELECT Id FROM SomeTable").List();
var ids = new List<int>();

foreach (var item in values)
{
   if (item != null)
      ids.Add(Convert.ToInt32(item));
}
var ids = session.Query<SomeEntity>().Select(x => x.Id).ToList();
var-Id=session.Query().Select(x=>x.Id.ToList();

我知道您没有使用
IQueryOver
,但它比您现在使用的方式更简单、更动态、更干净

public IList<TReturn> GetValues<TEntity, TReturn>(IProjection column, Junction where, int top) where TEntity : BaseEntity
{
    IQueryOver<TEntity> query = null;
    if(where == null)
        query = session.QueryOver<TEntity>().Select(column);
    else
        query = session.QueryOver<TEntity>().Select(column).Where(where);

    IList<TReturn> instance = null;
    if(top == 0)
        instance = query.List<TReturn>();
    else
        instance = query.Take(top).List<TReturn>();
    return instance;
}
这样,就避免了在代码中以字符串形式编写硬编码的SQL查询。如您所见,此函数可用于任何实体(表)和任何列