私はモデル呼び出しアドレスを持っています。そのモデルを使用して、いくつかの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 を受け入れ、エラーを排除します
ありがとう