2011-02-16 81 views
2

我创建了一个winform应用程序,我使用Nhibernate。在我的应用程序中,我需要选择我的数据库中的所有产品(74000行)。查询在Nhibernate

在我的产品对象上,我有一个对象列表,称为条形码。

我要选择我的所有产品,但只应装满物品放在产品操作搜索条码列表中,如果barcodetype = 20,组识别符号= 4

我不知道如何写这个查询,我一直在尝试与分离的标准,但我不能得到它的工作。任何人都可以帮我编写查询,或者链接到一个页面,我可以看到它的完成情况?

+1

为什么你需要选择所有74,000行? – Phill 2011-02-16 20:36:53

+0

我需要它用于导出方法。 – 2011-02-16 20:45:30

回答

3

由于集合不能“半载”,因此需要投影。

我这是怎么通常做到这一点:

var result = session.CreateQuery(@" 
    select product, barcode 
    from Product product 
    join product.Barcodes barcode 
    where barcode.Barcodetype = 20 
    and barcode.Groupid = 4 
    ") 
    .List<object[]>() 
    .ToLookup(x => (Product)x[0], x => (Barcode)x[1]); 

(我假定你有标性质称为Barcodetype和群ID,因为你没有指定任何关系,所有产品都有至少一个这种类型的条形码)

0

而不是实例化所有产品对象及其条形码的一部分,如何使用Criteria对条形码进行过滤,通过所提及的类型/组进行过滤并加入到父产品中。

然后使用AliasToBeanResultTransformer填充简单DTO对象的列表。

+0

或使用无状态会话... – asgerhallas 2011-02-17 14:49:02

0

我找到了答案,我做了一个外部左连接 crit.CreateCriteria(“barcodeses”,“bc”,SqlCommand.JoinType.LeftOuterJoin).Add(Expression.Or(Expression .Eq(“bc.Groupid”,CType(cbBarcodeGroup.SelectedItem,Domain.Barcodegroup).ID),Expr ession.IsNull(“bc.Groupid”)))