C# 特定字段的nHibernate Select语句

C# 特定字段的nHibernate Select语句,c#,nhibernate,select,C#,Nhibernate,Select,我使用nHibernate和c从数据库中获取记录或字符串列表,如下面的前几行代码所示。这个很好用。我要做的是从记录中选择几个特定字段,而不是整个记录。我尝试过各种技术,但似乎找不到任何关于如何做到这一点的例子。有人能看一下下面的代码,如果我走错了方向,请告诉我 谢谢 // THIS WORKS - Retrieve a list of my records from the table. Ilist<MyClass> classList = db.Session.CreateQue

我使用nHibernate和c从数据库中获取记录或字符串列表,如下面的前几行代码所示。这个很好用。我要做的是从记录中选择几个特定字段,而不是整个记录。我尝试过各种技术,但似乎找不到任何关于如何做到这一点的例子。有人能看一下下面的代码,如果我走错了方向,请告诉我

谢谢

//  THIS WORKS - Retrieve a list of my records from the table.
Ilist<MyClass> classList = db.Session.CreateQuery("FROM MyTable WHERE t.Name='AName'").List<MyClass>();


//  THIS WORKS - Retrieve a list of strings from the table
IList<string> stringList = db.Session.CreateQuery("SELECT c.ConstName FROM MyTable c WHERE c.Name='AName'").List<string>();


//  THIS DOES NOT WORK (RUN-TIME ERRORS).  HOW CAN I SELECT ONLY A FEW FIELDS FROM EACH RECORD?
//  This class contains only the records I want.
public struct MyClassB
{
    private string Name;
    private string Address;

    public string Name
    {
        get { return Name; }
        set { Name = value; }
    }

    public string Address
    {
        get { return Address; }
        set { stationName = Address; }
    }
}      


IList<MyClassB> classListB = db.Session.CreateQuery("SELECT t.Name, t.Address FROM MyTable t WHERE t.Name='AName'").List<MyClassB>();

查看别名TobeanResultTransformer-用法已演示。

查看别名TobeanResultTransformer-用法已演示。

您试图将无效的匿名类型强制转换到MyClassB中。而是为MyClassB创建一个映射

或者直接使用:

var specificFields = db.Session.CreateQuery("SELECT t.Name, t.Address FROM MyTable t WHERE t.Name='AName'").List();

var specificFields = db.Session.CreateQuery("SELECT t.Name, t.Address FROM MyTable t WHERE t.Name='AName'").List<Tuple<string,string>>();

列表中的对象将具有两个属性。

您试图将无效的匿名类型强制转换到MyClassB中。而是为MyClassB创建一个映射

或者直接使用:

var specificFields = db.Session.CreateQuery("SELECT t.Name, t.Address FROM MyTable t WHERE t.Name='AName'").List();

var specificFields = db.Session.CreateQuery("SELECT t.Name, t.Address FROM MyTable t WHERE t.Name='AName'").List<Tuple<string,string>>();

列表中的对象将具有两个属性。

只要类具有构造函数,您就应该能够执行以下操作:

IList<MyClassB> classListB = db.Session.CreateQuery("SELECT new MyClassB(t.Name, t.Address) FROM MyTable t WHERE t.Name='AName'").List<MyClassB>();

只要您的类有一个构造函数,您就应该能够执行以下操作:

IList<MyClassB> classListB = db.Session.CreateQuery("SELECT new MyClassB(t.Name, t.Address) FROM MyTable t WHERE t.Name='AName'").List<MyClassB>();

你能详细说明地图部分吗?这是可行的,我最终得到了一组对象。我想我可以通过执行一个特定的字段[record][field]来访问这些字段,但是编译器不允许对object类型进行索引。映射部分:您只需要为MyClassB创建一个映射,该映射指向MyClassA使用的同一个表,然后只映射MyClassB的两个属性和Identiy部分。请确保不允许对MyClassB进行更新和删除,因为它没有所有的行…抱歉,但是您没有向OP展示如何使用他们提供的模型进行更新和删除。您可以详细说明映射部分吗?这是可行的,我最终得到了一组对象。我想我可以通过执行一个特定的字段[record][field]来访问这些字段,但是编译器不允许对object类型进行索引。映射部分:您只需要为MyClassB创建一个映射,该映射指向MyClassA使用的同一个表,然后只映射MyClassB的两个属性和Identiy部分。请确保不允许对MyClassB进行更新和删除,因为它没有所有行…抱歉,但您没有向OP展示如何使用他们提供的模型进行更新。这是真的强制转换还是需要结果转换器?@TimothyGonzalez这是真的强制转换,请在此处查看完整的工作示例:这是真的强制转换还是需要结果转换器?@TimothyGonzalez这是真的强制转换,请在此处查看完整的工作示例: