考虑以下对象结构。
Product
id : int
name : string
attribute : list of Attribute
Attribute
id : int
name: string
value : string
product_id : int
Run Code Online (Sandbox Code Playgroud)
问题是:使用 QueryOver 如何形成子查询以返回具有以下条件的所有产品:
选择同时具有属性的所有产品:
属性名称=“颜色”值=“红色”并且属性名称=“尺寸”值=“XXL”?
编辑:示例sql:
select * from Product p where
exists (select id from attribute where name = 'Color' and value = 'Red' and product_id = p.id)
and
exists (select id from attribute where name = 'Size' and value = 'XXL' and product_id = p.id)
Run Code Online (Sandbox Code Playgroud) 我有以下对象
public class Document
{
public Guid Id { get; set; }
public ISet<Tag> Tags { get; set;}
...
}
public class Tag
{
public Guid Id { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
这是多对多关系,但我没有中间 DocumentTag 对象。我正在尝试使用 QueryOver 语法返回具有所有一组标签的所有文档。这是我到目前为止所拥有的。
Guid[] tagsThatMustMatch = ...;
var result = Session.QueryOver<Document>()
.WithSubquery
.WhereExists(QueryOver.Of<Tag>().Where(t => tagsThatMustMatch.Contains(t.Id))
.List()
Run Code Online (Sandbox Code Playgroud)
我很难表达这个要求。我知道我必须动态构建一个查询,该查询将为每个必须匹配的标签提供一个WhereExists。这些WhereExists 需要进行与运算。我遇到的另一个问题是WhereExists 方法需要接受DetachedQuery。但我没有办法限制它只查看该文档没有所有标签的标签。
有没有什么例子可以让我看到如何做这样的事情?
到目前为止,我知道局部变量或局部属性可以用作别名
ClassA _aliasA;
_session.QueryOver(x => x.ClassA, () => _aliasA);
Run Code Online (Sandbox Code Playgroud)
要么
ClassA AliasA { get; set; }
_session.QueryOver(x => x.ClassA, () => AliasA);
Run Code Online (Sandbox Code Playgroud)
我想知道其他选项是可行的.比如,外部类的属性是有效选项吗?
class ClassGenericAliases
{
ClassA Class { get; set; }
}
_session.QueryOver(x => x.ClassA, () => ClassGenericAliases.ClassA);
Run Code Online (Sandbox Code Playgroud)
静态可以用作别名吗?是否还有其他声明别名的选项?
我有以下代码:
1: ids = GetAnArrayOfIds();
2: jobEntities = jobEntities.Where(j => j.Locations.Select(l => l.Id).Any(ids.Contains));
Run Code Online (Sandbox Code Playgroud)
如何使用QueryOver编写2?
谢谢,
您好,是否有一个从代码中以编程方式从nhibernate构建查询的选项?
我不知道有多少限制,我正在构建自动机的表数将从对象列表进行查询.
我有这种情况:
var query = Session.QueryOver<T>()
var criteria = query.UnderlyingCriteria.SomethingThereAddCriterion()
如何将标准转换回IQueryOver()?
我正在使用Nhibernate 3.0并需要在网站上实现分页.基本上我们有一个ProductCategory,它有一个与之关联的产品集合.到目前为止,我有这个确实有效
var result = Session.QueryOver<TEntity>().TransformUsing(Transformers.DistinctRootEntity)
.Where(category => category.CategoryId == criteria.CategoryId)
.Fetch(category => category.Products).Eager
.Take(pageSize)
.Skip((pageIndex - 1)*pageSize)
.Future<TEntity>();
Run Code Online (Sandbox Code Playgroud)
这将返回我正在请求的类别,并根据传入的页面大小和页面索引正确分页子产品.
我现在想要做的实际上是获得产品的总行数,例如,即使我只返回5个产品,我需要知道总共有100个.
非常感谢
使用Linq,您可以轻松完成:
from c in session.Query<Site>()
select new {c.SiteName, c.SiteId,
c.Network, c.RegionLocation.City,
c.RegionLocation.Region.RegionName};
Run Code Online (Sandbox Code Playgroud)
有没有办法做这样的事情QueryOver
?看起来你可以做到这一点,SelectList
但这似乎不像linq方法那么干净.有更干净的方式吗?
我知道我需要使用Restrictions.Eq和Projections.SqlFunction,但我已经尝试了几个小时没有任何成功(我的测试应用程序只是崩溃).有没有人有一个QueryOver示例,可以在Oracle中执行以下操作:
SELECT
*
FROM
V_LOG_ENTRIES
WHERE
regexp_like(ENTRY_TEXT, '(\WPlaced\W)');
Run Code Online (Sandbox Code Playgroud)
更新:好的,我认为部分问题是Restrictions.Eq期望相等,但在这种情况下没有相等,它只是WHERE子句中的函数调用...
我在谷歌和stackoverflow上搜索类似的问题将近2个小时,但没有找到任何解决方案.
我有2个表,关系1对多.
1) [Accounts]
PK Account_Id
int User_ID
2) [Temporary_Accounts]
Fk Account_Id
char IsAccepted {'1','0',null}
varchar name
Run Code Online (Sandbox Code Playgroud)
和2个映射类
1) Acc
int Id;
User user;
TempAcc Temp; //cause each Account can have 0 or one TempAcc (with IsAccepted == null)
2)TempAcc
int Id;
bool IsAccepted;
string name;
Run Code Online (Sandbox Code Playgroud)
我想显示给定user_id的所有帐户以及在[Temporary_Accounts]和IsAccepted == null中有记录的Accounts的附加信息(fe name).
所以SQL应该是这样的:
select acc.Account_Id, acc.User_Id, tempacc.Name
from Account acc left join Temporary_Account tempacc
on (acc.Account_ID = tempacc.Account_Id and tempacc.IsAccepted is null)
where (acc.User_Id = 65);
Run Code Online (Sandbox Code Playgroud)
但我的IQueryOverquery:
IQueryOver<Acc> query = (...)
query.JoinAlias(f …
Run Code Online (Sandbox Code Playgroud) 当我使用HQL或Linq(Session.Query)获取内容时,我有一个NHibernate没有使用我的映射配置来急切加载集合的问题.Session.Get和Session.QueryOver正如预期的那样工作.
我正在使用NHibernate 3.2.这是我的产品映射中集合的映射.
<bag name="OrderItems" inverse="true" cascade="none" lazy="false" fetch="join">
<key column="order_id" />
<one-to-many class="OrderItem" />
</bag>
Run Code Online (Sandbox Code Playgroud)
从另一边看,映射看起来像这样:
<many-to-one name="Product" class="Product" column="product_id" not-null="true" />
Run Code Online (Sandbox Code Playgroud)
我有4个测试,2个是成功的,2个不是.他们使用Session.SessionFactory.Statistics来跟踪CollectionFetchCount(在1个连接查询中或在单独的查询中选择了OrderItem).目的是在选择产品时选择并加载OrderItem,因为几乎总是访问OrderItems.
LastCreated是对插入数据库的最后一个产品的简单引用.
[Test] /* Success */
public void Accessing_Collection_Using_Session_Get_Results_In_1_Select()
{
// Get by Id
var product = Session.Get<Product>(LastCreated.Id);
var count = product.OrderItems.Count;
Assert.AreEqual(0,statistics.CollectionFetchCount,"Product collectionfetchcount using Get");
}
[Test] /* Success */
public void Accessing_Collection_Using_Session_QueryOver_Results_In_1_Select()
{
// Get by Id
var product = Session.QueryOver<Product>().SingleOrDefault();
var count = product.OrderItems.Count;
Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using QueryOver");
}
Run Code Online (Sandbox Code Playgroud)
[Test] /* Fail …
Run Code Online (Sandbox Code Playgroud) 如标题所示。
(在我看来,这SelectList
是一种无需使用该Projections
方法即可创建投影的方法。)
queryover ×12
nhibernate ×10
c# ×3
icriteria ×2
.net ×1
asp.net ×1
criteria ×1
function ×1
hql ×1
linq ×1
nhibernate-3 ×1
pagination ×1
regex ×1
sql ×1
subquery ×1