1

私は取得し続けているため、この一般的なnhibernateクエリを機能させることができませんでした:

タイプ 'Product' の変数 'p' がスコープ'' から参照されていますが、定義されていません

この質問に対する多数の異なる回答をいじりましたが、問題が何であるかを理解していると思いますが、解決方法がわかりません。私が理解している限り、「p」は元のスコープに存在しますが、nhibernate queryover コマンドに到達するまでに存在を停止するため、Linq は名前でオブジェクトを参照するため、実際に何を話しているのかわかりません。 .

に含まれるさまざまなメソッドを試しました: variable 'x' of type 'Product' referenced from scope, but it is not defined ; NHibernate: 汎用メソッドの QueryOver ; nHibernate を使用した汎用リポジトリLambdaExpression 変数がスコープから参照されていますが、定義されていませんLINQ 式。スコープから参照されるタイプの変数「p」ですが、定義されていません

残念ながら、これらのどれも問題を解決できる答えを提供しませんでした. クエリ:

public class ProductsInformationQuery<T>: Query<T> where T:Product
{
    private readonly List<string> _ids;
    private readonly Expression<Func<T, object>> _func;

    public ProductsInformationQuery(List<string> ids, 
        FeaturedIdType featureIdType, Expression<System.Func<T,object>> func)
    {
        _ids = ids;
        _func = func;
    }

    public override List<T> Execute()
    {
        return Session.QueryOver<T>().Where(Restrictions.On<T>(_func).IsIn(_ids.Select(i => i).ToList())).List().ToList();
    }
}

これは、文字列のリストを取得し、特定のクエリについてデータベースをチェックします。これにより、ID のグループについてデータベースを試して確認することができます。Id は Guid (ID など) または String (名前など) のいずれかです。

呼び出しコード:

private List<Product> LoadProducts(List<string> ids)
    {
        System.Linq.Expressions.Expression<Func<Product, object>> function = b => b.Id.ToString();
        return _productsRepository.Execute(new ProductsInformationQuery<Product>(ids, FeaturedIdType.ProductId,function)).ToList();
    }

このコードは、チェックする必要がある関数として 'b=> b.Id.ToString()' を送信できる必要があります。QueryOver コマンドは、ID で製品を検索する必要があります。製品は継承チェーンのトップレベルなので、データベースからさまざまな種類の情報からさまざまな種類の製品を見つけられるようにしたいと考えています。

興味深いことに、次のように動作させることができました。

return Session.QueryOver<T>().Where(Restrictions.On<T>(b=>b.Id).IsIn(_ids.Select(Guid.Parse).ToList())).List().ToList();

ただし、次の 2 つではありません。

return Session.QueryOver<T>().Where(Restrictions.On<T>(b=>b.Id).IsIn(_ids)).List().ToList();

((AOD例外))

return Session.QueryOver<T>().Where(Restrictions.On<T>(b=>b.Id.ToString()).IsIn(_ids)).List().ToList();

((上記のエラー;「タイプの変数 'b'...」))

前者は Guid から Guid への比較であり、2 番目は Guid から String への比較 (Guid から string への変換が nhibernate で機能しないことは驚くべきことではありません) であり、3 番目は Guid から String への比較であり、データを収集するだけでなく b を変更します。

これに文字列、Guid、int、およびその他のデータ型を取りながら、あらゆる種類の製品を取り込む方法はありますか? または、クエリのいくつかのバージョンを作成することに制限されていますか?

ありがとう!

4

1 に答える 1