但这个问题在两个地方都没有得到妥善解答,所以我不得不再问:(
问题是,当它们之间没有可用的映射时,您可以使用Criteria API来连接两个表.
例如
class Order{ UserId , OrderId}
class User{UserId , UserName}
Run Code Online (Sandbox Code Playgroud)
我需要生成一个查询,如,
select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId
Run Code Online (Sandbox Code Playgroud)
如果有人知道这一点,请帮助..请注意我需要使用Criteria或QueryOver技术
谢谢/ BB
session.CreateMultiQuery().Add(...)
接受IQuery,但IQueryOver似乎不从IQuery继承.
对我来说似乎很奇怪,我无法在多个查询中使用QueryOver?
我有一点问题:我会在QueryOver中插入一个条件来检查变量值.像这样的东西:
var qOver = QueryOver.Of<MyModel>(() => myMod)
.JoinAlias(() => myMod.SubMod, () => subMod, JoinType.LeftOuterJoin)
.Where(Restrictions.Or(
Restrictions.On(() => myMod.ID).IsIn(MyIDList)
, Restrictions.On(MyIDList == null))
Run Code Online (Sandbox Code Playgroud)
在SQL sintax中有类似的东西
WHERE @Variable = '' OR MyTable.MyField = @Variable
Run Code Online (Sandbox Code Playgroud)
所以,如果我的变量已填满,我将过滤我的字段.如果我的变量为空(或为空),我将选择每个记录而不过滤任何内容.
如何使用QueryOver和Restrinctions达到此结果?谢谢!
我在使用带查询的子查询时遇到问题.
这就是我所拥有的
var address = QueryOver.Of<Address>()
.Where(x => x.City.IsLike("%" + city + "%")).Select(x => x.Person.Id);
var result = Session.QueryOver<Person>()
.Where(x => x.Type.IsLike(type + "%"))
.And(x => x.Name.IsLike("%" + name + "%"))
.WithSubquery.WhereExists(address);
Run Code Online (Sandbox Code Playgroud)
我有一个人的桌子,一个人有多个地方.
所以人的身份,姓名,类型
和地址将有PersonId和城市等.
因此,想要按名称和类型以及地址表中的城市搜索某个人
我有一个nhibernate问题,我正在投影sql Coalesce函数.
我正在比较来自两个不同实体的两个具有相同名称的字符串属性.在生成的sql中,仅比较来自第一个实体的相同属性:
var list = Projections.ProjectionList();
list.Add(
Projections.SqlFunction("Coalesce",
NHibernateUtil.String,
Projections.Property<TranslatedText>(tt => tt.ItemText),
Projections.Property<TextItem>(ti => ti.ItemText)));
var q = Session.QueryOver<TextItem>()
.Left.JoinQueryOver(ti => ti.TranslatedItems);
Run Code Online (Sandbox Code Playgroud)
在这个sql中评估q结果
coalesce(this_.ItemText, this_.ItemText)
Run Code Online (Sandbox Code Playgroud)
将this_
在RHS需要有一个别名表
我可以使用, Projections.Alias(Projections.Property<TranslatedText>(tt => tt.ItemText), "ttAlias")
但不知道如何映射"ttAlias" JoinQueryOver
.
我也可以在那里创建一个别名,但是看不到如何命名它.
TranslatedText ttAlias = null;
...
JoinQueryOver(ti => ti.TranslatedItems, () => ttAlias)
Run Code Online (Sandbox Code Playgroud) 有一个实体Effort有一个属性List和一个属性AdType
我们有几个adTypes枚举对象和specialLists枚举对象来选择IList<Effort>
我是这样做的:
return NHibernateSession.QueryOver<Effort>()
.JoinQueryOver(effort => effort.AdType)
.WhereRestrictionOn(adType => adType.Id)
.IsIn(adTypes.Select(adt => (long)adt).ToList())
.Clone()
.JoinQueryOver(effort => effort.List)
.WhereRestrictionOn(list => list.Id)
.IsIn(specialLists.Select(sl => (long)sl).ToList())
.List<Effort>();
Run Code Online (Sandbox Code Playgroud)
你可以看到我使用了一个没有任何描述的奇怪的Clone()方法.它很棒.
您以何种方式使用QueryOver进行此类查询?
我创建了一个ExpandoResultTransformer,用于将查询结果转换为dto以在UI中使用.它看起来像这样:
public class ExpandoResultTransformer : IResultTransformer
{
public object TransformTuple(object[] tuple, string[] aliases)
{
dynamic toReturn = new ExpandoObject();
for (int i = 0; i < aliases.Length; i++)
{
((IDictionary<string, object>)toReturn)[aliases[i]] = tuple[i];
}
return toReturn;
}
public IList TransformList(IList collection)
{
return collection;
}
}
Run Code Online (Sandbox Code Playgroud)
当我对createSQLQuery使用它时,它可以很好地工作
var contacts = _session.CreateSQLQuery("exec up_ClientContactsView @ClientId=:clientId")
.SetParameter("clientId", request.ClientId)
.SetResultTransformer(new ExpandoResultTransformer())
.List<dynamic>();
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试对QueryOver使用它时,我遇到了麻烦.没有发送别名.所以我尝试像这样指定它们
var periodTables = _session.QueryOver<PeriodTable>()
.Where(x => x.ClientPolicy.Id == request.ClientPolicyId)
.SelectList(list => list
.Select(i =>i.Id).WithAlias(()=>info.PeriodTableId) !! does not work as dynamic cannot …
Run Code Online (Sandbox Code Playgroud) 我有这个查询,但我似乎无法找到如何将我的 WhereRestrictionOn 设置为 OR。现在它们起到 AND 的作用,但我想要一个或另一个。
var privateInfo = Session.QueryOver<ConContact>()
.JoinAlias(c => c.PrivateInfos, () => pi)
.WhereRestrictionOn(c => c.FirstName).IsLike(_selectedFirstLetter + "%")
.WhereRestrictionOn(c => c.LastName).IsLike(_selectedFirstLetter + "%") // todo: change to firstname OR lastname
.Where(c => c.Status == ContactStatus.Approved)
.Select(
Projections.Property("pi.Id").WithAlias(() => sri.Id),
Projections.Property("FirstName").WithAlias(() => sri.Name), //todo: get fullname here => Add concontact object in privateinfo
Projections.Property("pi.Address").WithAlias(() => sri.Address),
Projections.Constant("Contact").WithAlias(() => sri.Type)
)
.TransformUsing(Transformers.AliasToBean<SearchResultInfo>())
.List<SearchResultInfo>()
.ToList();
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助 thx!
解决方案:
var privateInfo = Session.QueryOver<ConContact>()
.JoinAlias(c => c.PrivateInfos, () => pi)
.Where(
Restrictions.Disjunction() …
Run Code Online (Sandbox Code Playgroud) 创建 SQLCriterion 的正确语法是什么?
我有以下代码:
var sqlCriterion = new SQLCriterion(
new SqlString("{alias}.Id IN (SELECT Id FROM dbo.fGetSomeIds(?1, ?2))"),
new object[] { "param1", "param2" },
new IType[] { NHibernateUtil.String, NHibernateUtil.String });
query.Where(sqlCriterion);
Run Code Online (Sandbox Code Playgroud)
其中查询是我的 QueryOver 实例(用 NHibernateSession 创建)
当我调用 query.List() 时,出现以下异常:
Index was out of range. Must be non-negative and less than the size of the collection parameter name:index
Run Code Online (Sandbox Code Playgroud)
这是在 NHibernate.Criterion.SQLCriterion.ToSqlString(..)
我的 SQLCriterion 构造函数的语法是错误的还是我遗漏了其他东西?
我正在尝试使用queryover进行简单的选择并获得通用列表.
我想只从表中获得username
,email
并且firstname
,省略其余部分.
这是我的代码:
public IList<Users> GetAllByRole(string role)
{
var users= this.Session.QueryOver<Users>()
.where(f => f.role == role)
.select(f => f.username)
.select(f => f.email)
.select(f => f.firstname)
.list<Users>();
return users;
}
Run Code Online (Sandbox Code Playgroud)
错误:
The value \"x\" is not of type \"Model.Poco.Entities.Users\" and cannot be used in this generic collection.\r\nParameter name: value
SQL Query就是这样的
SELECT [username]
,[email]
,[firstname]
FROM [MyDB].[dbo].[MyTable]
WHERE [role] = 'admin'
Run Code Online (Sandbox Code Playgroud)
我也试过这样的事
IList<Users> users = this.Session.QueryOver<Users>()
.Where(p => p.role == role)
.SelectList(list => list
.Select(p …
Run Code Online (Sandbox Code Playgroud) nhibernate ×10
queryover ×10
c# ×3
.net ×2
asp.net-mvc ×1
criteria ×1
generics ×1
join ×1
multi-query ×1
restrictions ×1
subquery ×1