C# 仅从表中选择几列

C# 仅从表中选择几列,c#,.net,nhibernate,C#,.net,Nhibernate,我在使用c、nhibernate和link时遇到问题。在下面的示例中,我在BrandTable中进行了选择,但只需要Name和Id列。 但它总是对表中的所有列进行选择。 使用EntityFramework,下面的同一代码仅使用这两列生成select 在nhibernate如何做到这一点 using (ISession session = MyConnection.GetCurrentSession()) { var brands = from b in

我在使用c、nhibernate和link时遇到问题。在下面的示例中,我在BrandTable中进行了选择,但只需要Name和Id列。 但它总是对表中的所有列进行选择。 使用EntityFramework,下面的同一代码仅使用这两列生成select

在nhibernate如何做到这一点

 using (ISession session = MyConnection.GetCurrentSession())
        {
            var brands = from b in session.QueryOver<BrandTable>().List()
                                 orderby b.Name
                                 select new Brand {Id = b.id, Name = b.Name};

            return brands.ToList();
        }

这是一个使用投影的示例:

List results = session.CreateCriteria<BrandTable>()
.SetProjection( Projections.ProjectionList()
     .Add( Projections.Id(), "Id" )
     .Add( Projections.Property("Name"), "Name" )
)
.SetResultTransformer(Transformers.AliasToBean<BrandTable>()); // edit - don't forget the result transformer! 
.List();

您也可以在NH的QueryOver中执行此操作。以下摘自

投影

可以使用.Select方法添加根类型属性的简单投影,该方法可以接受多个Lambda表达式参数:

IList selection =
    session.QueryOver<Cat>()
        .Select(
            c => c.Name,
            c => c.Age)
        .List<object[]>();
由于此查询不再返回Cat,因此必须显式指定返回类型。如果投影单个属性,则可以使用以下命令指定返回类型:

IList<int> ages =
    session.QueryOver<Cat>()
        .Select(c => c.Age)
        .List<int>();

在上面的链接中还有几个关于如何使用投影的例子

您不能将查询理解用于QueryOver,因为它不是Linq提供程序。在您的示例中,您实际上选择了所有记录,然后使用LINQ访问对象。将NHibernate.Linq名称空间添加到文件中,并将查询重写为

from b in session.Query<BrandTable>()
orderby b.Name
select new Brand {Id = b.id, Name = b.Name};

您可以使用以下步骤为一个域选择某些列:

创建一个包含所需字段的小类: 例子: 查询要从何处提取信息的域实体 在示例中,Lead是我们想要提取信息的实体。请注意,目的地与目标类别LeadInformation的类型相同。
这将返回目标类LeadInformation的可查询列表,其中只有源域类的两列。

第二个示例不起作用。它将所有列发送到查询。第二个示例不起作用,因为它在内存中过滤集合。您正在排序并在内存中应用投影,这就是为什么它不起作用。List方法选择所有记录。
IList<int> ages =
    session.QueryOver<Cat>()
        .Select(c => c.Age)
        .List<int>();
from b in session.Query<BrandTable>()
orderby b.Name
select new Brand {Id = b.id, Name = b.Name};

 private class LeadInformation
  {
            public string Id { get; set; }
            public DateTime AdmissionDate { get; set; }
  }


 IQueryable leads =
                repository.Query()
                .Where(x => x.AdmissionRepUserObj.ID.ToString() == filter.UserId
                    ).Select(lead => new LeadInformation 
                     {AdmissionDate = lead.DateApplied.Value,
                     Id = lead.ID.ToString()});