1

MongoDb C# ドライバーはプロジェクションをサポートしていないことを知っているので、少し検索したところ、多くの人が mongoCursor を使用してそのようなクエリを実行していることがわかりました。特定のフィールドのみを選択しようとしています。私のコードは次のとおりです。

public T GetSingle<T>(Expression<Func<T, bool>> criteria,params Expression<Func<T, object>>[] fields) where T : class
{
    Collection = GetCollection<T>();
    return Collection.FindAs<T>(Query<T>.Where(criteria)).SetFields(Fields<T>.Include(fields)).SetLimit(1).SingleOrDefault();
} 

その上にユーザー用のカスタムリポジトリを取得しました:

public User GetByEmail(string mail, params Expression<Func<User, object>>[] fields)
{
    return GetSingle<User>(x=>x.Email==mail,fields);
}

これは使用法です:

_repository.GetByEmail(email, x=>x.Id,x=>x.DisplayName,x=>x.ProfilePicture)

しかし、私はパラメータに含まれるフィールドを取得していますが、クラス User の一部であるすべての列挙型、日付、およびブール値も取得しています。文字列であり、フィールドリストに含まれていない値は null であるため、問題ありません

ここに画像の説明を入力

それを避けるために私は何ができますか?

4

1 に答える 1

2

を使用SetFieldsすると、ワイヤを通過するものを指定できます。Tただし、この場合は、ハイドレートされた type のオブジェクトを返すようにドライバーに要求していますUser

、とは値型intであるため、それらの値を にすることはできません。したがって、これは厳密には C# の問題です。これらのプロパティが存在しないことを示す値はありません。代わりに、デフォルト値を想定します (数値型のおよび など)。一方、Aは参照型であるため、null になる可能性があります。enumbooleannullfalsebool0string

戦略

プロパティを null 許容にする モデルで null 許容フィールドを使用できます。

class User {
    public bool? GetMailNotifications { get; set; }
}

そのようにして、値の型は有効な値の 1 つを持つか、または になりますnull。ただし、プロパティにアクセスしたいときはいつでもnullチェックを行ってmyUser.GetMailNotifications.Valueorヘルパーを使用する必要があるため、これは扱いにくい場合があります。myUser.GetMailNotifications.GetValueOrDefault

代わりに単にフィールドを含めてください。これはその方法 の問題には答えませんが、それらを含めることをお勧めする理由が少なくとも 3 つあります。

  1. オブジェクトを渡すときUserは、オブジェクトが有効な状態であることが望ましいです。そうしないと、部分的にハイドレートされたオブジェクトをメソッドに渡し、メソッドがそれをさらに渡す可能性があり、ある時点で、オブジェクトが不完全であるために意味のない操作を試みる人がいる可能性があります。
  2. より使いやすく
  3. とにかく控えることをお勧めしますが、ここではそうではありません。

問題は、なぜ特定のフィールドを除外するためにあらゆる努力をしたいのかということです。

于 2013-10-11T07:10:07.133 に答える