2011-03-02 73 views
0

我是NHibernate和FNH的新手。我试图查询单个查询中的多个可能的对象,我不确定最有效的查询是什么。我有话的词典:流利NHibernate自定义SQL查询

public class Word 
{ 
    public virtual int Id { get; set; } 
    public virtual string Text { get; set; } 
} 

我想查询中包含的一个列表中的所有字对象。在SQL我已经是:

SELECT (*) FROM dbo.Word WHERE Text LIKE 'word1%' OR Text LIKE 'word2%' ... 

现在我刚开的单词列表,并生成SQL查询的WHERE条款。我创建了一个ISQLQuery,但我不确定如何执行它并取回Word对象的集合。

+1

您是否忘记了示例查询中的“%”?它有所作为... – 2011-03-02 22:54:23

+0

对不起,更新! – 2011-03-02 22:56:35

回答

3

由于您使用的是NHibernate,为什么不使用为您提供的工具而不是编写可能倾向于SQL注入的自定义SQL。

public IList<Word> GetWords(IList<string> filters) 
{ 
    var criteria = Session.CreateCriteria<Word>(); 
    var disjunction = Restrictions.Disjunction(); 
    foreach (var filter in filters) 
    { 
     disjunction.Add(Restrictions.Like("Text", filter, MatchMode.Start)); 
    } 
    criteria.Add(disjunction); 

    return criteria.List<Word>(); 
} 
+0

@Yads当我使用该方法运行时,出现异常:您的SQL语句的某些部分嵌套得太深。重写查询或将其分解为更小的查询。 – 2011-03-02 23:18:39

+0

@韦斯利,你指定了多少个过滤器? – Vadim 2011-03-02 23:19:33

+0

那么用户正在输入有效的无限文本,我想拉出所有有效的单词。对于这个特定的测试用例,我认为我只能做大约200. – 2011-03-02 23:21:21