我正在尝试从NH 3.0 Cookbook中获取一些代码,并想知道为什么我无法获得下面的代码来编译.我认为应该使这个工作的QueryProjectionBuilder在"NHibernate.Criterion.Lambda"中,但它的using指令没有帮助.
问题是SelectGroup和SelectAvg部分.假设书中的语法是正确的,那么有人可以看到缺少的参考吗?
namespace Queries.Implementations
{
using System;
using System.Collections.Generic;
using System.Linq;
using Eg.Core;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.Criterion.Lambda;
public class QueryOverQueries : CookbookQueriesBase
{
public override IEnumerable<NameAndPrice> GetAvgDirectorPrice(ISession session) {
return _session.QueryOver<Movie>()
.Select(list => list
.SelectGroup(m => m.Director)
.SelectAvg(m => m.UnitPrice)
)
.List<object[]>()
.Select(props =>
new NameAndPrice
{
Name = (string) props[0],
Price = (decimal) props[1]
});
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有这个使用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)
.TransformUsing(Transformers.DistinctRootEntity);
}
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)
我试过了两个
.TransformUsing(Transformers.DistinctRootEntity);
Run Code Online (Sandbox Code Playgroud)
和 …
我正在尝试按以下方式生成SQL:
SELECT
t.*,
SELECT (...)
FROM Title t
[trimmed]
Run Code Online (Sandbox Code Playgroud)
使用QueryOver
Title title = null;
var q = session
.QueryOver(() => title)
.Select(
Projections.Alias(Projections.Property<Title>(t => t.Id), "Id"),
Projections.Alias(Projections.Property<Title>(t => t.Name), "Name"),
....
Projections.SubQuery(sq.Where(tt => tt.Id == title.Id))), "TopLevelGenre")
)
[code trimmed]
Run Code Online (Sandbox Code Playgroud)
Title中有15个属性我想要投射.是否有一种更简单的方法可以让我不必单独预测每个属性,就像我上面开始做的那样?
我使用以下QueryOver:
var query = searchTermRepository.GetAllOver()
.Where(Restrictions.On<Entities.SearchTerm>(c => c.Text).IsLike(filter.Value, MatchMode.Start))
.Select(Projections.Distinct(Projections.Property<Entities.SearchTerm>(x => x.Contact)))
.Inner.JoinQueryOver(x => x.Contact).Take(100);
Run Code Online (Sandbox Code Playgroud)
这会创建:
SELECT distinct TOP ( 100 /* @p0 */ ) this_.ContactId as y0_
FROM SearchTerm this_
inner join Contact contact1_
on this_.ContactId = contact1_.Id
left outer join Company contact1_1_
on contact1_.Id = contact1_1_.Id
left outer join Person contact1_2_
on contact1_.Id = contact1_2_.Id
left outer join Branch contact1_3_
on contact1_.Id = contact1_3_.Id
left outer join ContactGroup contact1_4_
on contact1_.Id = contact1_4_.Id
WHERE this_.Text like 'koc%%' /* …Run Code Online (Sandbox Code Playgroud) 我希望将属性值转换合并到我的QueryOver查询中.
我喜欢在查询对象模式之后编写查询,直接生成MVC视图模型.在我的视图模型中,我尝试使用尽可能简单的属性类型,将转换复杂性保留在视图和控制器之外.这意味着有时候,我需要将一种类型转换为另一种类型,例如将日期转换为字符串.
有人可能会争辩说,这种转换应该在视图中执行,但由于我的大多数视图模型都直接转换为JSON对象,这会导致转换变得更加麻烦.在JavaScript中执行日期到字符串转换充其量是有问题的,我的JSON转换器不够灵活.
这是我正在做的一个例子:
// Entity.
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public DateTimeOffset DateCreated { get; set; }
}
// View model.
public class CustomerViewModel
{
public string Name { get; set; }
public string DateCreated { get; set; } // Note the string type here.
}
// Query.
CustomerViewModel model = null;
List<CustomerViewModel> result = Session.QueryOver<Customer>()
.SelectList(list => list
.Select(n => n.Name).WithAlias(() => model.Name)
.Select(n => …Run Code Online (Sandbox Code Playgroud) 基本上我想要做的就是编写这段SQL:
SELECT
CASE
WHEN t.type = 'a' THEN
t.name
ELSE
t.otherName
END
as "Name"
FROM myTable t
Run Code Online (Sandbox Code Playgroud)
在QueryOver中
我想在我的基础存储库类中添加一个方法,允许我使用LIKE表达式,但我不太清楚如何解决这个问题.我想创建一个通用方法,查看传入的表达式树,并在传入的字符串值中查找通配符.然后,它将相应地生成QueryOver语句.
我目前有以下内容:
public IList<T> FindAll(Expression<Func<T, bool>> criteria, char wildCard)
{
return SessionFactory.GetCurrentSession()
.QueryOver<T>()
.Where(criteria)
.List();
}
Run Code Online (Sandbox Code Playgroud)
显然,困难的部分尚未到来.我需要查看表达式树并QueryOver动态构建查询.寻找关于如何继续这一点的一些指示.或者我只是在这里浪费时间,应该在我的存储库中创建处理LIKE查询的单个方法?
理想情况下,我想区分以下内容:
所以生成的查询将是:
我正在尝试编写QueryOver语句,以按降序时间顺序选择N行.
session.QueryOver<T>().Take(10).OrderBy(x=>x.DateInserted);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这根本不起作用.有什么方法可以解决它吗?
我重构旧式查询CreateCriteria()到QueryOver().我的Wcf服务获取string PropertyName订单查询结果.对于IQueryable我使用动态LINQ做这样的排序,为CreateCriteria()- AddOrder().
IList<object[]> result =
GetSession()
.QueryOver(() => activity)
.JoinAlias(() => activity.ActivityLicense, () => license)
.Select(Projections.ProjectionList()
.Add(Projections.Count<Activity>(e => e.Id), "ActivityCount")
.Add(Projections.Group(() => license.SerialNumber), "SerialNumber")
.Add(Projections.Count<Activity>(e => e.MacAdress), "MacAddressCount")
.Add(Projections.Count<Activity>(e => e.IpAdress), "IpAddressCount")
)
.OrderByAlias("ActivityCount") // Compilation Error - I need such extension method
.List<object[]>();
Run Code Online (Sandbox Code Playgroud)
有关字符串属性名称如何排序的任何建议?
PS:我无法使用LINQ到Nhibernate:LINQ to NHibernate - .GroupBy().Skip().Take()导致异常
谢谢!
所以我花了最后几个小时寻找答案,我似乎找不到任何有意义的东西.
public class Game
{
public virtual Guid ID { get; set; }
public virtual ResultStructure Structure { get; set; }
public virtual List<Result> Results { get; set; }
}
public class Result
{
public virtual Player Player { get; set; }
public virtual int Position { get; set; }
}
public class ResultStructure
{
public virtual Guid ID { get; set; }
public virtual List<ResultOutcomes> Outcomes { get; set;}
}
public class ResultOutcomes
{
public virtual int Position { …Run Code Online (Sandbox Code Playgroud) queryover ×10
nhibernate ×8
c# ×5
distinct ×2
asp.net-mvc ×1
case ×1
hibernate ×1
icriteria ×1
join ×1
linq ×1
projection ×1
sql ×1