相关疑难解决方法(0)

如何使用nHibernate和QueryOver API获得明显的结果?

我有这个Repository方法

    public IList<Message> ListMessagesBy(string text, IList<Tag> tags, int pageIndex, out int count, out int pageSize)
    {
        pageSize = 10;
        var likeString = string.Format("%{0}%", text);
        var query = session.QueryOver<Message>()
            .Where(Restrictions.On<Message>(m => m.Text).IsLike(likeString) || 
            Restrictions.On<Message>(m => m.Fullname).IsLike(likeString));

        if (tags.Count > 0)
        {
            var tagIds = tags.Select(t => t.Id).ToList();
            query
                .JoinQueryOver<Tag>(m => m.Tags)
                .WhereRestrictionOn(t => t.Id).IsInG(tagIds);
        }            

        count = 0;
        if(pageIndex < 0)
        {
            count = query.ToRowCountQuery().FutureValue<int>().Value;
            pageIndex = 0;
        }
        return query.OrderBy(m => m.Created).Desc.Skip(pageIndex * pageSize).Take(pageSize).List();
    }
Run Code Online (Sandbox Code Playgroud)

您提供自由文本搜索字符串和标签列表.问题是,如果邮件有多个标签,则会列出重复的时间.我想要一个基于Message实体的独特结果.我看了看

Projections.Distinct
Run Code Online (Sandbox Code Playgroud)

但它需要一个属性列表来处理不同的问题.这条消息是我的实体根,大部分是在不提供所有实体属性的情况下获得此行为的方法吗?

提前谢谢,安德斯

c# nhibernate queryover

48
推荐指数
3
解决办法
4万
查看次数

流畅的NHibernate N + 1问题与复杂的对象

我有一个问题,NHibernate查询数据库的方式太多次了.我刚刚意识到它可能与n + 1问题有关,但我无法弄清楚如何改变我的映射来解决问题.

正如您将看到的,我的尝试涉及指定不延迟加载其他对象,但它似乎没有做到这一点.

这是查询:

public IQueryable<Report> ReadAll(DateTime since)
{
    return m_session.QueryOver<Report>()
       .JoinQueryOver(r => r.Mail)
       .Where(m => m.Received >= since)
       .List()
       .AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的回复!如果您需要有关我的对象或映射的更多信息,请告诉我们.

简化对象图(一些省略):

public class Report : EntityBase
{
    public virtual Product Product { get; set; }
    public virtual StackTrace StackTrace { get; set; }
    public virtual Mail Mail { get; set; }

    public virtual IList<ClientUser> ReadBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

-

public class Product : EntityBase
{
    public virtual string Name { get; set; }
    public …
Run Code Online (Sandbox Code Playgroud)

nhibernate nhibernate-mapping fluent-nhibernate

11
推荐指数
1
解决办法
612
查看次数

使用NHibernate映射一对多的最小和正确方法

我是NHibernate和C#的新手,所以请保持温柔!

我有以下两个NHibernate实体:

Employee
{
    private long _id;
    private String _name;
    private String _empNumber;
    private IList<Address> _addresses;

    //Properties...
}
Run Code Online (Sandbox Code Playgroud)

Address
{
    private long _id;
    private String _addrLine1;
    private String _addrLine2;
    private String _city;
    private String _country;
    private String _postalCode;

    //Properties
}
Run Code Online (Sandbox Code Playgroud)

他们有一个one-to-many从关系EmployeeAddress (每个员工可以在自己的记录多个地址).方便地忽略多个员工可能居住在同一地址的事实.

我从内存中的对象(NHibernate实体)的角度理解这一点.我正在努力的是映射文件(我在这里举一个简单的例子).这是我到目前为止所提出的:

// Intentionally left out XML and <hibernate-mapping> 
// Mappings for class 'Employee'. -->
<class name="Employee" table="Employees">
    <id name="ID">
        <generator class="native">
    </id>

    <property name="Name" />
    <property name="EmpNumber" />

    <bag name="Addresses">
        <key …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate orm nhibernate-mapping

8
推荐指数
1
解决办法
2万
查看次数

带有Fetch的NHibernate QueryOver导致多个sql查询和db命中

我正在尝试选择一个实体并获取相关列表:

    Session.QueryOver<UserRole>()
           .Fetch(x => x.UsersInRole).Eager
           .List();
Run Code Online (Sandbox Code Playgroud)

这导致了大量的数据库命中.第一个是这样的:

 SELECT ... FROM UserRoles
 left outer join UsersInRoles on ...
Run Code Online (Sandbox Code Playgroud)

还有数百个单独的查询,看起来像:

 SELECT ... FROM UsersInRoles
 left outer join UserRoles on ...
 WHERE UserRoles.UserId=?
Run Code Online (Sandbox Code Playgroud)

映射如下:

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id);
        Map(x => x.RoleName);
        HasManyToMany(x => x.UsersInRole)
        .Inverse()
        .LazyLoad()
        .Table("UsersInRoles");
    }
}
Run Code Online (Sandbox Code Playgroud)

c# sql nhibernate fetch queryover

5
推荐指数
1
解决办法
1732
查看次数

NHibernate <one-to-many>

我该如何映射这两个类?

public class LDAVehicle 
{
    public virtual int VehicleId { get; set; }
    public virtual string ChassisSeries { get; set; }
    public virtual string ChassisNumber { get; set; }

    public virtual List<LDAReading> Readings { get; set; }
}

public class LDAReading 
{
    public virtual int ReadingId { get; set; }
    public virtual DateTime IncomingDate { get; set; }
    public virtual DateTime ReadoutDate { get; set; }
    public virtual string Sender { get; set; }

    public virtual LDAVehicle Vehicle { get; …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate orm hibernate nhibernate-mapping

5
推荐指数
1
解决办法
1万
查看次数