0

私は次の方法を持っています:

ServiceType GetWithValidServices(long ServiceTypeID);

および次の関数:

public ServiceType GetWithValidServices(long ServiceTypeID)
    {
        IQuery query = CurrentSession.CreateQuery("select dl.ServiceType from Service as dl"
         + "where dl.ServiceType.ID = :id and dl.IsValid = true"
         + "order by dl.HavePriority desc");

        query.SetInt64("id", ServiceTypeID);

        var dlArt = query.UniqueResult<ServiceType>();
        return dlArt;
    }

次のメソッドでは、上記の関数を呼び出します。

 public ServiceCollection GetService(long ServiceTypeID)
    {

        ServiceType d = DomainToWebgridMapper.GetWebgridServiceType(DaoFactory.Instance.ServiceTypeDao.GetWithValidService(ServiceTypeID));

        return d.Service;
    }

私の問題は、クエリが正しく実行されていないことです。サービスは表示されますが、dl.IsValid が実行されていないフィルターが表示されます。また、彼はタイプを優先順位で並べ替えていません。

他のいくつかのメソッドでwhere句を使用していますが、正常に機能しています。

ここで何が問題なのかわかりません。多分誰かが私を助けることができます。

前もって感謝します

4

1 に答える 1

0

私はあなたの問題が何であるかを理解していると思います。これは、文字列を連結してクエリを作成する方法と関係があります。少し考えてみてください。

string query = "select dl.ServiceType from Service as dl"
     + "where dl.ServiceType.ID = :id and dl.IsValid = true"
     + "order by dl.HavePriority desc";

文字列の最初/最後にスペースや改行を挿入していないため、クエリは次のようになります。

select dl.ServiceType from Service as dlwhere dl.ServiceType.ID = :id and dl.IsValid = trueorder by dl.HavePriority desc
                                      ^^^^^^^                                          ^^^^^^^^^

問題をマークした場所がわかりますか?これを修正するには、連結してクエリを構成する最後の文字列を除くすべての文字列の最後にスペースを追加するか、代わりに逐語的な文字列リテラルのようなものを使用します。

IQuery query = CurrentSession.CreateQuery(
    "select dl.ServiceType from Service as dl " +
    "where dl.ServiceType.ID = :id and dl.IsValid = true " +
    "order by dl.HavePriority desc"
);
于 2012-07-26T09:30:24.107 に答える