我有这个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)
但它需要一个属性列表来处理不同的问题.这条消息是我的实体根,大部分是在不提供所有实体属性的情况下获得此行为的方法吗?
提前谢谢,安德斯
我有一个问题,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和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从关系Employee到Address (每个员工可以在自己的记录多个地址).方便地忽略多个员工可能居住在同一地址的事实.
我从内存中的对象(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) 我正在尝试选择一个实体并获取相关列表:
Session.QueryOver<UserRole>()
.Fetch(x => x.UsersInRole).Eager
.List();
Run Code Online (Sandbox Code Playgroud)
这导致了大量的数据库命中.第一个是这样的:
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=?
映射如下:
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) 我该如何映射这两个类?
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)