2

IDbSet インターフェイスを実装して FakeDataSet クラスを実装しています。このインターフェイスを実装する一環として、Find メソッドを実装する必要があります。すべてのエンティティ クラスには、Guid タイプ Id 列があります。この FakeDbSet クラスの Find メソッドを実装しようとしていますが、一般的な方法で記述するのに苦労しています。以下は、このメソッドを作成するための私の試みです。

public class FakeDataSet<T> : IDbSet<T> where T: class, new()  
{  
  //  Other methods for implementing  IDbSet interface
  public T Find(params object[] keyValues)  
  {  
       var keyValue = (Guid)keyValues.FirstOrDefault();
       return this.SingleOrDefault(m => m.Id == keyValue);  // How can I write this
  }
}

Id が Guid 型であることを認識していないため、m.Id 呼び出しでコンパイル エラーが発生します。

'T' には 'Id' の定義が含まれておらず、タイプ 'T' の最初の引数を受け入れる拡張メソッド 'Id' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

これをどのように達成できるかについてのアイデアはありますか?

4

1 に答える 1

3

あなたにアイデアを与えるためにこのようなもの:

public virtual T Find(params object[] keyValues)
{
    if (keyValues.Length != _keyProperties.Count)
        throw new ArgumentException("Incorrect number of keys passed to find method");

    IQueryable<T> keyQuery = this.AsQueryable<T>();

    for (int i = 0; i < keyValues.Length; i++)
    {
        var x = i; // nested linq

        keyQuery = keyQuery.
        Where(entity => _keyProperties[x].GetValue(entity, null).Equals(keyValues[x]));
    }

    return keyQuery.SingleOrDefault();
}

ソース: Generic Repository: 偽の IDbSet 実装の更新 (Find Method & Identity key)

于 2012-10-08T03:49:48.660 に答える