0

私のアプリケーションには非常に単純なリポジトリ パターンがありますが、Code First Model といくつかの追加データを返す必要がある異常が発生しました。下記参照。

public IEnumerable<User> GetUsersWithinLocation(DbGeography geography)

返されるモデルに本当に含めたいのは、User インスタンスと、地理からの距離 (マイルなど) です。

ここに私が見るオプションがあります:

オプション 1:距離なしでユーザー オブジェクト リストを返し、フロントエンドで 2 回目の再計算を行い、データ モデルの混乱を避けることができますが、少し冗長に思えます..そして、これは特定の状況では不可能である可能性があり、このアプローチは間違っていると私は感じています。

オプション 2:もう 1 つのオプションは、User から構成されるか、User を継承する新しい DTO を作成することです。たとえば、UserDistance オブジェクトです。これで必要なものはすべて手に入りますが、このために新しいリポジトリを作成しますか? 各モデル タイプで返されるデータのバリエーションが多数ある場合、大規模なアプリケーションでこれを維持するのはやや手に負えないと考えることができます。

オプション 3:ある種の動的な ExtraData ViewBag レイヤーを実装します。ここでは、DTO と共に追加のデータを任意に渡すことができます。名前を知る必要があるため、これによりレイヤー間の結合がより緊密になります。私もこのアプローチはあまり好きではありません。

どんなガイダンスでも大歓迎です。

4

3 に答える 3

1

これは、次の二重呼び出しを取り除くためのアプローチですDistance

public IDictionary<User, double?> GetUsersWithinByLocation(DbGeography geography)
{
    return this.Query.Select(x => new KeyValuePair<User, double?>(x, x.Address.Location.Distance(geography)))
                     .OrderBy(kvp => kvp.Value)
                     .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}

あなたができる他のこと、そして私が少し良いと思うのはあなたのリターンタイプを変更することです、それであなたはより単純でより速いLINQクエリをすることができます、ここにコードがあります:

public IEnumerable<KeyValuePair<User, double?>> GetUsersWithinByLocation(DbGeography geography)
{
    return this.Query.Select(x => new KeyValuePair<User, double?>(x, x.Address.Location.Distance(geography)))
                     .OrderBy(kvp => kvp.Value);
}

このアプローチは、そのまま使用することも、を使用するKeyValuePair<T1, T2>こともできますTuple<T1, T2>

どちらの場合も、私が行ったことは、最初に計算を「保存」し、次に句ののプロパティをDistance介してそれにアクセスすることであることに注意してください。ValueKeyValuePair<T1, T2>OrderBy

お役に立てれば ;)

于 2013-03-10T08:04:57.153 に答える
0

これはどうですか?ここに問題はありますか?

public IDictionary<User, double?> GetUsersWithinByLocation(DbGeography geography)
{
    return this.Query.OrderBy(x=>x.Address.Location.Distance(geography))
          .ToDictionary(x => x, x => x.Address.Location.Distance(geography));
}

主な問題は、この Distance 関数を 2 回実行していることです。これを回避する方法はありますか?

于 2013-03-10T06:52:38.523 に答える
0

私は通常、別の質問を自問します。データ転送にドメイン オブジェクトを使用できますか? 答えがイエスであることはめったにありません。なぜでしょうか?UI がドメイン モデルを切り抜けて、これとあれの一部を必要とする場合が多くあります。(ほぼ)常にビューモデルが関係しています。ほとんどの場合、ビュー モデルは検証されます。

だから私にとって:オプション2。ただし、リポジトリはビュー モデルを提供するべきではありません。これは、リポジトリとビュー (mvc の場合はコントローラー) の間に位置し、ビュー モデルのデータを収集するためにリポジトリ呼び出しを調整するサービス レイヤーである必要があります。リポジトリIQueryableは s を内部的に公開し、サービスはこれらの IQueryables でクエリを作成してIEnumerables を公開します。

于 2013-03-10T10:48:03.143 に答える