4

私はモデル呼び出しアドレスを持っています。そのモデルを使用して、いくつかのcrud操作を作成しました。これを行う過程で、任意の数のプロパティに基づいてクエリを作成できる方法が必要です:

public static IEnumerable<address> GetByParams(Expression<Func<address, bool>> predicate, int? pageNumber, int? pageSize)
    {
        using (IDbConnection db = DbFactory.OpenDbConnection())
        {
            if ((pageNumber != null) && (pageSize != null))
            {
                var data = db.Where<address>(predicate).Skip((int) pageNumber).Take((int) pageSize).ToList();
                if (data.Any())
                {
                    data[0].TotalCount = data.Count();
                    data[0].TotalPages = (int) (data.Count()/pageSize);
                }
                return data;
            }
            //this is the code that creates the error
            return db.Where<address>(predicate);
        }
    }

次に、このコードを次の方法でテストしてみました。

ViewBag.PossibleBilling = new SelectList(address.GetByParams(x=> x.AddressType == 2,null,null),0);

ただし、これはこれまでで最も奇妙なエラーになります:(エラーは selectList からのものではありません)

The given key was not present in the dictionary.

これをグーグルで検索しようとしましたが、結果は実際のエラーよりも複雑です。述語を正しいタイプとして設定していないこと、または述語をどこに渡す前に何かが起こらなければならないことに関係があると思います。

述語の理由は、これをすべて生成する TT ファイルがあるため、プロパティ名がわからず、匿名のままにする必要があるためです。

編集:

将来の読書を明確にするために:私はこれをservicestack.ormliteに対して使用しています:https ://github.com/ServiceStack/ServiceStack.OrmLite

モデルでいくつかの基本的なcrudメソッドを構築するためにTTファイルを作成しようとしています.ormlite内でこのコードを見つけました:

System.Collections.Generic.List<T> Where<T>(this System.Data.IDbConnection dbConn, object anonType) Member of ServiceStack.OrmLite.OrmLiteReadConnectionExtensions

オブジェクトanonTypeは自分のクエリ/述語になる

ページング コードが間違っていますが、これはエラーの過程ではありません。drax によって解決された問題は、params を使用した選択だけが必要なときに、Where を使用していたことです。

この改善により、コードの使用法が次の手順に変更されます。

public static List<T> Select<T>(this IDbConnection dbConn, Expression<Func<T, bool>> predicate)

このプロシージャは Expression を受け入れ、エラーを排除します

ありがとう

4

2 に答える 2

2

Where 拡張メソッドの代わりに Select を使用する必要があると思います。したがって、あなたの例は次のように書くことができます:

public static IEnumerable<address> GetByParams(Expression<Func<address, bool>> predicate, int? pageNumber, int? pageSize)
{
    using (IDbConnection db = DbFactory.OpenDbConnection())
    {
        if ((pageNumber != null) && (pageSize != null))
        {
            var data = db.Select<address>(predicate).Skip((int) pageNumber).Take((int) pageSize).ToList();
            if (data.Any())
            {
                data[0].TotalCount = data.Count();
                data[0].TotalPages = (int) (data.Count()/pageSize);
            }
            return data;
        }
        //this is the code that creates the error
        return db.Select<address>(predicate);
    }
}
于 2013-04-15T18:52:20.173 に答える
1

私の推測では、address.GetByParams(...)パーツは空のセットを返すため、SelectList のデフォルトの選択を 0 番目の要素に設定することはできません (何もありません)。

GetByParams を介してデータベースから実際に結果を取得するかどうかを確認します。AddressType が 2 のアドレスが存在するか?

于 2013-03-29T14:44:17.510 に答える