我的代码就像
DepartmentPaperConsumption dto = null;
Run Code Online (Sandbox Code Playgroud)
然后我有NHibernate QueryOver结果,我想订购它
result.OrderByAlias(() => dto.TotalColorCopys);
Run Code Online (Sandbox Code Playgroud)
但我希望能够dto用字符串动态指定任何属性.我尝试使用动态LINQ,但似乎我无法得到它.我也试过从头开始构建LambdaExpression - 也没有运气.我将不胜感激任何帮助.
我想知道在使用QueryOver选择后如何订购一组结果.我的查询如下:
CurrentSession.QueryOver<Book>()
.Where(b => b.Author.Name = "SimpleName")
.Select(Projections.Distinct(Projections.Property<Book>(b => b.Genre)))
.OrderBy<Genre>(g => g.Name) // this extension does not exist! How do I order for a Genre?
.List<Genre>()
Run Code Online (Sandbox Code Playgroud)
我能怎么做?
谢谢!
对象结构:房子有很多房间.一个房间有很多桌子.一张桌子上有很多花瓶(上面).
房子>房间>桌子>花瓶.
我想使用JoinQueryOver选择所有带有红色花瓶的表 - 在特定的房子里.
我想这样做:
var v = session.QueryOver<House>()
.Where(x => x.ID == HouseID)
.JoinQueryOver<Room>(x => x.Rooms)
.JoinQueryOver<Table>(x => x.Tables)
.JoinQueryOver<Vase>(x => x.Vases)
.Where(x => x.Color == "Red")
.SingleOrDefault<House>();
Run Code Online (Sandbox Code Playgroud)
这是我尝试的一种方法(许多方法都失败了).我真的不想要房子和房间信息.
最终,我正在寻找一个桌子列表(在一个特定的房子里),他们的花瓶(红色)的集合被取出.
谢谢您的帮助!
编辑
像这样的东西会很好:
var v = session.QueryOver<Table>()
.Where(x => x.Room.House.ID == HouseID) // this Where won't work.
.JoinQueryOver<Vase>(x => x.Vases)
.Where(x => x.Color == "Red")
.List().ToList();
Run Code Online (Sandbox Code Playgroud) 我怎样才能将groupby Id添加到这个nhibernate代码中,因为我是新手,并且有许多方法,但对我来说都没有用.
.Select(Projections.Sum(() => ServiceOrderItem.WorkTime),
Projections.ProjectionList().Add(Projections.Property(
() => ServiceOrder.Id).WithAlias(() => TechnicianWorkTime.Id))
)
Run Code Online (Sandbox Code Playgroud)
ProjectionList中会有更多...
我有一个使用NHibernate使用Session.Query<T>方法的linq查询,我在这个查询中获取一些复杂的属性和集合属性.我想知道,如何IN从运算符中添加一个条件int[]?看看我的代码:
public IEnumerable<Product> GetProducts(int[] idCategories)
{
// how to add IN condition here or a subquery
var query = Session.Query<Product>()
.Where(?????)
.Fetch(x=>x.Category)
.FetchMany(x=>x.Status).ThenFetch(x=>x.Item);
return query.ToList();
}
Run Code Online (Sandbox Code Playgroud)
我有另一个方法做一个查询来获得这个int[],我想在这里应用它,或者如果有任何方法在IN运算符上添加这个子查询,我真的很感激!
OBS:如果必要,我可以转换int[]成List<int>.
我int[]通过以下查询得到了这个:
return session.Query<Category>.Where(...).Select(x => x.Id).ToArray();
Run Code Online (Sandbox Code Playgroud)
我的第二个问题是,如何将此查询作为子查询添加到按类别筛选?
谢谢!
我必须尝试根据搜索找到结果,这应该是从头开始,但我找不到QueryOver哪个有开头,还有其他的吗?
public IEnumerable<Company> Find(string keyword)
{
var sesion = SessionController.CurrentSession;
return sesion.QueryOver<Company>()
.Where(
Restrictions.On<Company>(x => x.CompanyName).IsLike("%" + keyword + "%") ||
Restrictions.On<Company>(x => x.Id).IsLike("%" + keyword + "%")
)
.List<Company>();
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试在 NHibernate QueryOver 中执行以下 T-SQL,但没有成功:
SELECT Id, SUM(CASE MyValue WHEN 1 THEN Volume ELSE Volume * -1 END)
FROM MyTable
GROUP BY Id
Run Code Online (Sandbox Code Playgroud)
我试图总结所有成交量,但MyValue=1应为正值,否则为负值。到目前为止,我得到了:
var result = this.Session.QueryOver<MyTable>()
.Select(Projections.Group<MyTable>(x => x.Id),
Projections.Conditional(Restrictions.Eq(Projections.Property<MyTable>(x
=> x.MyValue), '1'),
Projections.Property<MyTable>(x => x.Volume),
Projections.Property<MyTable>(x => x.Volume * -1)))
.List();
Run Code Online (Sandbox Code Playgroud)
但是你可以想象 NHibernate 不知道 column Volume * -1,那么我如何在我的 CASE 中进行这个计算?
我有一个多对多的关系,我试图查询.我的问题与Phillip Haydon 在这里详述的问题非常类似,所以我将自由地借用他的图表和解释.
Phillip在Jobs和Roles之间存在以下多对多关系(抱歉我还无法嵌入图像):
数据模式
Phillip需要查询未分配给作业的所有角色.他的解决方案如下:
Role roleAlias = null;
var existing = QueryOver.Of<JobRole>()
.Where(x => x.Job.JobId == jobId)
.And(x => x.Role.RoleId != roleId)
.And(x => x.Role.RoleId == roleAlias.RoleId)
.Select(x => x.Role);
result = Session.QueryOver<Role>(() => roleAlias)
.Where(x => x.IsEnabled)
.WithSubquery.WhereNotExists(existing)
.OrderBy(x => x.Name).Asc
.List();
Run Code Online (Sandbox Code Playgroud)
这非常有用,但似乎在这个解决方案中每个表都有一个实体; 工作,JobRole和角色.JobRole既有工作又有角色.可能是这样的:
public class Job
{
public int JobId {get;set;}
public string Name {get; set;}
public bool IsEnabled {get;set;}
public bool IsDefault {get;set;}
}
public class Role
{
public int RoleId {get;set}
public string …Run Code Online (Sandbox Code Playgroud) 考虑以下因素QueryOver(季度和中心是传入的变量):
QueryOver.Of<Activity>()
.Where(Restrictions.On<Activity>(a => a.StartDate).IsBetween(quarter.StartDate).And(quarter.EndDate) ||
Restrictions.On<Activity>(a => a.EndDate).IsBetween(quarter.StartDate).And(quarter.EndDate) ||
Restrictions.And(Restrictions.Lt("StartDate", quarter.StartDate), Restrictions.Gt("EndDate", quarter.EndDate))) //TODO: Refactor this to remove magic strings
.And(a => a.Centre == centre)
.OrderBy(a => a.Title).Asc;
Run Code Online (Sandbox Code Playgroud)
此查询工作正常,但我想更改以下限制以删除魔术字符串:
Restrictions.And(Restrictions.Lt("StartDate", quarter.StartDate), Restrictions.Gt("EndDate", quarter.EndDate))
Run Code Online (Sandbox Code Playgroud)
以下是实体(为简洁而剪裁):
public class Quarter
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
public class Activity
{
public string Title { get; set; }
public Centre Centre { get; set; }
public DateTime StartDate { get; set; …Run Code Online (Sandbox Code Playgroud) 我正在使用Asp net 5,NHibernate 3.3和Kendo UI MVC包装器来生成网格以呈现客户订单表.数据库中已经有很多订单,数量也在不断增长.所以我决定使用服务器端分页来避免从数据库中获取所有订单.据我所知,你不能手动分页并委托过滤,排序和分组到ToDataSourceResult方法.无论是全有还是全无.因此,我试图实现所谓的"自定义绑定".在我进行分组之前没问题.我需要先进行分组,然后在组内部进行排序,然后提取特定页面的数据以及所有这些数据而不将所有数据加载到内存中.我的代码是这样的(我把它全部放在一块以简化阅读):
var orderList = CurrentSession.QueryOver<Order>();
// Filtering. Filter is a search string obtained from DataSourceRequest
var disjunction = new Disjunction();
disjunction.Add(Restrictions.On<Order>(e => e.Number).IsLike("%" + filter + "%"));
disjunction.Add(Restrictions.On<Order>(e => e.Customer).IsLike("%" + filter + "%"));
orderList = orderList.Where(disjunction);
// Sorting. sortColumn is also from DataSourceRequest
switch (sortColumn)
{
case "Number":
orderList = orderList.OrderBy(x => x.Number).Desc;
break;
case "GeneralInfo.LastChangeDate":
orderList = orderList.OrderBy(x => x.LastChangeDate).Desc;
break;
default:
orderList = orderList.OrderBy(x => x.Number).Desc;
break;
}
}
// …Run Code Online (Sandbox Code Playgroud)