フィールド値を設定する各レコードで関数を呼び出そうとしています。結果はその後、ページングされることを意図している場合、これは次のように実現されます。ダッパー結果から各レコードの関数を呼び出す
public IDataWrapper GetPagedQuery<T>(string myQuery, object param, Action<T> customAction)
{
var obj = new DataWrapper();
using (var oConn = CreateConnection(ConnectionString))
{
TotalPages totalRows = null;
var list = oConn.Query<T, TotalPages, T>(myQuery, (e, t) =>
{
totalRows = t;
if (mapAction != null) customAction(e);
return e;
}, param, splitOn: "SplitOn");
obj.RowsFound = (IEnumerable<dynamic>)list;
obj.TotalRows = totalRows == null ? 0 : totalRows.TotalRows;
}
return obj;
}
私の問題は、結果がページングされることを意図していないときに来ています。最初の例の私のクエリにはsplit on columnが含まれているので、それはすべて正常に動作しますが、次のクエリはすべての行や列などを返すSelect Column1, Column2 FROM MyAwesomeTable
などの単純なクエリです。
問題は戻ってくる各結果に対してcustomActionを適用する必要があります。今度は数百万のレコードが潜在する可能性があることを想像してみてください。私の状況では、これは非現実的ではないと私に信じてください。最初のケースと同じように、ダッパーが結果を返すときに適用されます。ここで
は、私が試したものです:
public IDataWrapper GetNonPagedQuery<T>(string myQuery, object param, Action<T> customAction)
{
var obj = new DataWrapper();
using (var oConn = CreateConnection(ConnectionString))
{
var list = oConn.Query<T>(myQuery, (e) =>
{
if (mapAction != null) customAction(e);
return e;
}, param).ToList();
obj.RowsFound = (IEnumerable<dynamic>)list;
obj.TotalRows = list.Count();
}
return obj;
}
私はそれが方法Query<T>(etc...
私はそれが存在しないので、それがあることを理解し解決することはできません上記のコードのエラーを取得します。私はここで何をしようとしているのかを達成する最良の方法を尋ねています。それは大胆で可能ですか?
SplitOnについてのあなたの理解は間違っています。その目的は、1-1複合エンティティをマップすることであり、ページネーションとは関係がなく、あらゆる種類のクエリで使用できます。 Sqlクエリとしてフェッチされた同じ繰り返し値となる、すべてのレコードのTotalRowsを置き換える現在のコードは、それ自体が最適な使用法ではありませんが、任意の数のレコードで他の部分についても繰り返すことができます。あなたが明示的に適用されている場合、メモリ内のデータを取得して、メモリ内のデータを行き来することを心配する必要はありません。 –
@MrinalKamboj私はSplitOnをよく理解していると信じています。完全なSQL文。私は質問の中のその部分を誤解し、誤解を説明することができないかもしれません。私が言っていたのは、ページネーションはspliton列を使用しているということです。短いストーリー、最初のクエリはSplitOnを使用し、2番目のクエリは使用しません。誤解して申し訳ありません。 – Bojan
私の言い方を理解すると、SplitOnにカスタムアクションを適用するために提供されたFuncを使用しています。実際にはSplitonでも繰り返し値を満たしていますが、どちらも正しくありません。 Dapperが実際にLinq 2のオブジェクトプロバイダであるようにメモリコレクションを通過しているときに、コレクションをトラバースする必要はないという印象の下にありました。理想的な方法は、どこでもSplitOnを削除することです。代わりにQueryMultipleを使用して、単一の呼び出しで別々の結果を取得し、受け入れた応答に示されているように個別にアクションを適用します –