我需要知道JoinQueryOver和JoinAlias之间的区别是什么,以及何时使用它们?
谢谢.
嗨当我使用查询转换API时,是否有任何优雅的方式组合'喜欢'和'或'?对于'喜欢'有类似的东西:
query.WhereRestrictionOn(x=>x.Code).IsLike(codePart)
Run Code Online (Sandbox Code Playgroud)
对于'或'我可以做类似的事情:
query.Where( x=>x.Code == codePart || x.Description== codePart)
Run Code Online (Sandbox Code Playgroud)
但是如何创建这样的查询:
select*from n,其中代码如'%abc%'或描述如'%abc%'
我有这个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)
但它需要一个属性列表来处理不同的问题.这条消息是我的实体根,大部分是在不提供所有实体属性的情况下获得此行为的方法吗?
提前谢谢,安德斯
我会像这样创建一个QueryOver
SELECT *
FROM Table
WHERE Field IN (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
我尝试过Contains
方法,但我遇到了异常
"System.Exception:无法识别的方法调用:System.String:Boolean包含(System.String)"
在这里我的代码
var qOver = _HibSession.QueryOver<MyModel>(() => baseModel)
.JoinAlias(() => baseModel.Submodels, () => subModels)
.Where(() => subModels.ID.Contains(IDsSubModels))
.List<MyModel>();
Run Code Online (Sandbox Code Playgroud) 想象一下以下(简化)数据库布局:
我们有许多"假期"记录,涉及在特定日期前往特定住宿等.
我想从数据库中提取每个住宿的"最佳"假期(即最低价格),给定一组搜索标准(例如持续时间,出发机场等).
将有多个具有相同价格的记录,因此我们需要选择保存(降序),然后按出发日期升序.
我可以写SQL来做这个看起来像这样(我不是说这必然是最优化的方式):
SELECT *
FROM Holiday h1 INNER JOIN (
SELECT h2.HolidayID,
h2.AccommodationID,
ROW_NUMBER() OVER (
PARTITION BY h2.AccommodationID
ORDER BY OfferSaving DESC
) AS RowNum
FROM Holiday h2 INNER JOIN (
SELECT AccommodationID,
MIN(price) as MinPrice
FROM Holiday
WHERE TradeNameID = 58001
/*** Other Criteria Here ***/
GROUP BY AccommodationID
) mp
ON mp.AccommodationID = h2.AccommodationID
AND mp.MinPrice = h2.price
WHERE TradeNameID = 58001
/*** Other Criteria Here ***/
) x on h1.HolidayID = x.HolidayID and …
Run Code Online (Sandbox Code Playgroud) 我发现了2个类似的问题:
根据这个页面:
注意不要急于同时获取多个集合属性.虽然这个声明可以正常工作:
Run Code Online (Sandbox Code Playgroud)var employees = session.Query<Employee>() .Fetch(e => e.Subordinates) .Fetch(e => e.Orders).ToList();
它对数据库执行笛卡尔积产品查询,因此返回的总行数将是总下属乘以总订单数.
可以说我有以下型号:
public class Person
{
public virtual int Id { get; private set; }
public virtual ICollection<Book> Books { get; set; }
public virtual ICollection<Article> Articles { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用QueryOver/Linq(不返回笛卡尔积),急切地使用书籍,文章和地址加载所有人的最简单方法是什么?
谢谢
更新:
见cremor的回答下面和弗洛里安林的回答在这个线程.以下代码很好地工作,只有一次往返数据库.
var persons = session.QueryOver<Person>()
.Future<Person>();
var persons2 = session.QueryOver<Person>() …
Run Code Online (Sandbox Code Playgroud) 我正在使用作为NHibernate 3.x一部分的QueryOver api.我想得到一个行计数,但我正在使用的方法返回所有对象,然后获取集合的计数.有没有办法只返回行数的整数/长值?
我目前正在使用:
_session.QueryOver<MyObject>().Future().Count()
Run Code Online (Sandbox Code Playgroud) 我正在使用FluentNHibernate和NH 3.0,使用LINQ提供程序和新的QueryOver语法.
现在使用QueryOver我想得到一个项目(称为结果),其时间戳值尽可能接近给定值,但不是更大:
Result precedingOrMatchingResult = Session.QueryOver<Result>().
Where(r => r.TimeStamp < timeStamp).
OrderBy(r => r.TimeStamp).Desc.
FirstOrDefault(); //get the preceding or matching result, if there is any
Run Code Online (Sandbox Code Playgroud)
现在,Intellisense告诉我,没有一种FirstOrDefault()
方法.当然,我可以枚举我的有序查询,然后使用LINQ获取我的项目.但这会首先将所有项目加载到内存中.
有没有替代FirstOrDefault()
,或者我理解完全错误的东西?
我试图用于hibernate annotations
将数据插入到MySQL database
没有定义主键的表中.
但事实上,该表的2个字段在表中是唯一的.我可以使用hibernate注释实现相同吗?
这是我的代码..
@Entity
@Table(name = "RolesMenuItems")
public class RolesMenuItems {
@Column(name = "RoleID")
private String roleID;
@Column(name = "MenuItemID")
private String menuItemID;
/*setter getter methods */
}
Run Code Online (Sandbox Code Playgroud) 我使用子查询获得以下NHibernate查询:
NHContext.Session.QueryOver<Item>()
.WithSubquery.WhereProperty(x => x.ItemId).In(QueryOver.Of<Foo>().Where(x => x.AFlag).Select(x => x.ItemId))
.WithSubquery.WhereProperty(x => x.ItemId).In(QueryOver.Of<Bar>().Where(x => x.AFlag).Select(x => x.Item))
.Future<Item>();
Run Code Online (Sandbox Code Playgroud)
这将运行以下SQL:
SELECT *
FROM item this_
WHERE this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Foo this_0_
WHERE this_0_.AFlag = 1 /* @p0 */)
and this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Bar this_0_
WHERE this_0_.AFlag = 1 /* @p0 */)
Run Code Online (Sandbox Code Playgroud)
我希望它使用OR,例如:
SELECT *
FROM item this_
WHERE this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Foo this_0_
WHERE this_0_.AFlag = 1 /* …
Run Code Online (Sandbox Code Playgroud)