1

どの名前空間にメソッドの何が含まれているかを見つけることができません。

  • たとえばNHibernate.IQueryOver、'Add' の定義が含まれておらず、 type の最初の引数を受け入れる拡張メソッド 'Add' もありません。

拡張メソッドのため、Visual Studio は適切なメソッドを使用するのに役立ちません。

どのメソッド、名前空間を含める必要があるかを知るにはどうすればよいですか?

4

3 に答える 3

2

QueryOver を別のメソッドに渡し、それに対して何らかのフィルタリングを実行したい場合、渡される型を知っている必要があります。

以下のスニペットは、IBusinessObjectID と名前を持つ既知のインターフェースがあることを示しています。whereこれは、ジェネリック パラメータ T および U の条件を作成し、そのインターフェイスに関連するいくつかのものを適用するのに役立ちます。

using NHibernate.Criterion;

namespace MyNamespace
{
    public interface IBusinessObject
    {
        int ID { get; }
        string Name { get; }
    }

        public static QueryOver<T, U> AddSomeFilter<T, U>(QueryOver<T, U> queryOver)
            where T: IBusinessObject
            where U: IBusinessObject
        {
            // here we can play with ID, and Name
            // because we know that U is of a type IBusinessObject
            queryOver
                .Where(x => x.ID > 1)
                .Where(x => x.Name == "Abc");

            return queryOver;
        }
    }
}

これは問題ありませんが、依存関係につながる可能性があります。それが、私が正直に Criteria API を使用するのが好きな理由です。いくつかのメタデータを渡し、より動的なプロセッサを作成できます。

public static class MyExtension
{
    public static ICriteria AddLike(ICriteria criteria, string property, string likeValue)
    {
        if (property.IsNotEmpty())
        {
            criteria.Add(Restrictions.Like(property, likeValue));
        }
        return criteria;
    }

コメントでメソッドを処理するには、次のようにします。

public class SearchCriteria
{
    public string PropertyName { get; set; }
    public string LikeValue { get; set; }
}

public static class MyExtension
{
   public static IQueryOver<Employee, Employee> ConstructQueryConditions(
        this IQueryOver<Employee, Employee> query
        , SearchCriteria criteria)
    {
        if (criteria.PropertyName.IsNotEmpty())
        {
            query.Where(Restrictions.Like(criteria.PropertyName, criteria.LikeValue));
        }
        return query;
    }
于 2015-04-19T13:21:00.747 に答える
1

QueryOverのようなエンティティを作成するには、 とエンティティへの参照Employeeのみが必要ですISession

// using for below query
using System;
using MyProject.Entity;
using MyProject.Data; // to get session

上記を使用して、このクエリを作成できます

...
var session = ... // get session
Employee empl = null;

var employee = session
    .QueryOver<Employee>()
    .Where(x => x.ID > 1)
    .SelectList(list => list
        .Select(x => x.ID)
        .Select(x => x.FirstName)
        .Select(x => x.LastName)
    )
    .Skip(10)
    .Take(10)
    .List<Employee>();

制限のようなヘルパーを使用するには、

using NHibernate.Criterion;

これによりRestrictions、 、ProjectionsQueryOver.Of()

var disjunction = Restrictions.Disjunction();
var projection = Projections.Sum("Age");
var detachedQuery = QueryOver.Of<Employee>();

概要:

  1. ヘルパーにアクセスするには、NHibernate.Criterion が必要です。
  2. QueryOverAPIにアクセスするには、QueryOverインスタンスだけが必要です。これらのメソッドは拡張機能ではないため、そのメソッドです...

QueryOver を渡したい場合は、Criterion を参照するだけです。

using NHibernate.Criterion;

namespace MyNamespace
{
    public static class MyExtension
    {
        public static QueryOver<T, U> AddPaging<T, U>(QueryOver<T, U> queryOver)
        {
            queryOver
                .Skip(10)
                .Take(10);

            return queryOver;
        }
    }
}
于 2015-04-19T13:00:51.503 に答える
0

どこかにあるとわかっているメソッドが見つからない場合、通常はILSpyを使用して dll を調べます。それを実行し、すべての「デフォルト」アセンブリを削除し、必要なアセンブリ (たとえば、nhibernate のもの) のみをドラッグ アンド ドロップしてから、[表示] -> [検索] を選択し、タイプ名がわかっている場合は、コンボ ボックスで[タイプ] を選択します。 、メソッド名がわかっている場合は、Memberを選択します。

于 2015-04-19T12:26:56.843 に答える