NHibernate QueryOver-执行获取和排序->使用什么语法?

时间:2019-04-02 22:23:05

标签: asp.net .net nhibernate queryover

全部

我有这样的查询

_AddOrderBy(sortOptions, query)
                .Fetch(x => x.ImageType).Eager
                .Fetch(x => x.User).Eager
                .Fetch(x => x.Partner).Eager
                .Inner.JoinAlias(x => x.Partner, () => p).Fetch(x => x.Company).Eager

                .Skip(startIndex)
                .Take(pageSize)
                .List<ImageRequest>();

在上面的QueryOver中,我调用_AddOrderBy()方法,该方法添加了一个order by子句。我面临的挑战是如何创建一个“ order by”,以引用位于以下关联路径内的属性(按“ CompanyName”排序),而又不与我的Fetch()/内部联接冲突:

ImageRequest.Partner.Company.CompanyName

在我的_AddOrderBy()中,我有这个:

Partner p = null;
            Company comp = null;
            order = query.Inner.JoinAlias(x => x.Partner, () => p)
                .Inner.JoinAlias(x => x.Company, () => comp)
                .OrderBy(x => comp.CompanyName);

但是,这给了我一个运行时异常,表明我在条件中有重复的密钥(指合作伙伴)。我可以看到这与我急切的获取相冲突。 我的问题是:

如何添加“排序依据”,以便与我的抓取配合使用。

1 个答案:

答案 0 :(得分:1)

在QueryOver中使用别名的好处在于,如果Fetch发生在JoinAlias方法中,则不必在_AddOrderBy()方法中再次使用Join_AddOrderBy()已查询。您只需要使用相同的名称声明别名。

因此,您的Partner p = null; Company comp = null; order = query .Inner.JoinAlias(x => p.Company, () => comp) // you can use p here if it was used in the query before .OrderBy(x => comp.CompanyName); 如下所示:

Partner p

之所以起作用,是因为:如果将整个代码放在一个方法中,则显然会起作用。将其分为两种方法仍然可行,因为Alias不是对内存中对象的引用,而是对SELECT DISTINCT t3.prod_id, t3.awaiting_approval, t3.brand, t3.prod_name, t3.size, t3.units, t3.category, t3.image, t3.url, t3.quantity, t3.rank, t3.word_count, t3.word_count FROM ((SELECT item_info_mem.prod_id, item_info_mem.awaiting_approval, item_info_mem.prod_name, item_info_mem.brand, item_info_mem.size, item_info_mem.units, item_info_mem.category, (SELECT rank FROM search_tags_mem WHERE prod_id = item_info_mem.prod_id AND tag = "bread" ORDER BY rank LIMIT 1) AS rank, (SELECT image FROM images_mem WHERE prod_id = item_info_mem.prod_id ORDER BY id LIMIT 1) AS image, (SELECT url FROM urls_mem WHERE prod_id = item_info_mem.prod_id AND disabled IS NULL ORDER BY id DESC LIMIT 1) AS url, (SELECT quantity FROM shopping_list_mem WHERE user_id = "1" AND prod_id = item_info_mem.prod_id ORDER BY id LIMIT 1) AS quantity, ( Substrcount(Lcase(item_info_mem.prod_name), Lcase("bread")) + Substrcount(Lcase(item_info_mem.brand), Lcase("bread")) ) AS word_count, ( Substrcheck(Lcase(item_info_mem.prod_name), Lcase(item_info_mem.brand), Lcase("bread")) ) AS word_count_unique FROM item_info_mem WHERE NOT EXISTS (SELECT id FROM search_tags_omit_mem WHERE prod_id = item_info_mem.prod_id AND tag = "bread" ORDER BY id DESC LIMIT 1) AND ( item_info_mem.prod_name REGEXP "bread" OR item_info_mem.brand REGEXP "bread" ) AND EXISTS(SELECT scans_mem.scan_id FROM scans_mem, stores_mem WHERE scans_mem.price IS NOT NULL AND scans_mem.expired IS NULL AND item_info_mem.prod_id = scans_mem.prod_id AND NOT EXISTS (SELECT user_stores_disabled_mem.user_id FROM user_stores_disabled_mem , stores_mem WHERE scans_mem.store_id = stores_mem.id AND user_stores_disabled_mem.chain = stores_mem.chain AND user_stores_disabled_mem.user_id = 1) AND ( Sqrt(Pow(111 * (stores_mem.gps_lat - 40.748080 ), 2) + Pow(111 * (stores_mem.gps_lng - -73.990533) * Cos( 40.748080 / 57.3) , 2)) <= (SELECT user_mem.distance FROM user_mem WHERE id = 1)) AND stores_mem.id = scans_mem.store_id)) UNION ALL (SELECT item_info_mem.prod_id, item_info_mem.awaiting_approval, item_info_mem.prod_name, item_info_mem.brand, item_info_mem.size, item_info_mem.units, item_info_mem.category, search_tags_mem.rank, (SELECT image FROM images_mem WHERE prod_id = item_info_mem.prod_id ORDER BY id LIMIT 1) AS image, (SELECT url FROM urls_mem WHERE prod_id = item_info_mem.prod_id AND disabled IS NULL ORDER BY id DESC LIMIT 1) AS url, (SELECT quantity FROM shopping_list_mem WHERE user_id = "1" AND prod_id = item_info_mem.prod_id ORDER BY id LIMIT 1) AS quantity, ( Substrcount(Lcase(item_info_mem.prod_name), Lcase("bread")) + Substrcount(Lcase(item_info_mem.brand), Lcase("bread")) ) AS word_count, ( Substrcheck(Lcase(item_info_mem.prod_name), Lcase(item_info_mem.brand), Lcase("bread")) ) AS word_count_unique FROM item_info_mem, search_tags_mem, scans_mem, stores_mem WHERE NOT EXISTS (SELECT id FROM search_tags_omit_mem WHERE prod_id = item_info_mem.prod_id AND tag = "bread" ORDER BY id DESC LIMIT 1) AND scans_mem.price IS NOT NULL AND scans_mem.expired IS NULL AND item_info_mem.prod_id = search_tags_mem.prod_id AND search_tags_mem.tag = "bread" AND item_info_mem.prod_id = scans_mem.prod_id AND NOT EXISTS (SELECT user_stores_disabled_mem.user_id FROM user_stores_disabled_mem, stores_mem WHERE scans_mem.store_id = stores_mem.id AND user_stores_disabled_mem.chain = stores_mem.chain AND user_stores_disabled_mem.user_id = 1) AND ( Sqrt(Pow(111 * (stores_mem.gps_lat - 40.748080), 2) + Pow(111 * (stores_mem.gps_lng - -73.990533) * Cos( 40.748080 / 57.3) , 2)) <= (SELECT user_mem.distance FROM user_mem WHERE id = 1)) AND stores_mem.id = scans_mem.store_id)) t3 ORDER BY -rank DESC, word_count_unique DESC, word_count DESC, Field(t3.category, "food", "grocery", "pantry, household & pets", "confectionery and grocery") DESC, Length(prod_name), brand LIMIT 0, 10 ```` 的引用,该$ cat file [-0.0, 1.23] [-0.0, 1.23, 4.56] foo=[12.3, 4.5, 3.0, 4.1], bar=123.0, xyz=6.7 [1,2,-3,4] 只是转换为SQL查询的字符串。