1

私はMonoDroidWebサイトでTaskyのケーススタディをフォローしていますが、フィルタリングと順序付けのクエリを作成しているときに壁にぶつかりました。誰かが私がどこで間違っているのか説明してもらえないかと思っていました。私はおそらく完全に逆行しているのでしょう!

エラーが発生します:

メソッド'ICanTalk.BusinessLayer.Services.WordServices.Find(System.Func、System.Func、bool、int、int)'の型引数は、使用法から推測できません。タイプ引数を明示的に指定してみてください。

リポジトリの1つに次のコードがあります。うまくいけば、私がやろうとしていることはある程度明確です。私はまだそれを構築して、それが機能するかどうかをテストすることができていません:

  public static IEnumerable<Word> Find<T,U>(Func<Word, bool> whereClause, Func<Word,U> orderBy, bool ascending, int show, int page)
  {
      int currentPage = page;
      int resultsPerPage = show;
      int skip = currentPage*show;

      var result = ascending
                       ? me.db.Find<Word>().Where(whereClause).OrderBy(orderBy).Take(resultsPerPage).Skip(skip)
                       : me.db.Find<Word>().Where(whereClause).OrderByDescending(orderBy).Take(resultsPerPage).Skip(skip);

      return result;

  }

私のサービスから、私はここからこのメソッドを呼び出します:

  public static IList<Word> Find<T>(Func<Word, bool> whereClause, Func<Word,DateTime> orderBy, bool ascending, int show, int page)
  {
      return WordRepository.Find<Word, DateTime>(whereClause, orderBy, ascending, show, page).ToList();
  }

私が達成しようとしているのは、MonoDroid内のイベントハンドラーからの次のような呼び出しです。

 var wordTest = WordServices.Find(x => x.ChildId == 3, x => x.AddedAt, true, 5, 1);
4

2 に答える 2

0

どちらのメソッドも汎用Find<T,U>であり、 -しかし、メソッド定義のどこにもFind<T>型を使用していないようです。タイプになると期待されていましたかT?あなたが使用している他の場所でorderByで一度使用されます-それらの使用法のどれが間違いですか?TWord
Ubool

定義の中で、そして(それが意図したことである場合)で置き換えWordてみて、メソッドを呼び出すときに、実際に正しいタイプで呼び出すことができますか?TboolU

var wordTest = WordServices.Find<Word>(x => x.ChildId == 3,
                                       x => x.AddedAt, 
                                       true, 5, 1);
于 2012-09-01T19:03:09.853 に答える
0

私はそれをほぼ正しく持っていました、私はそれを基本に落とし、戻って戻って次のことを思いつきました(興味があればオリジナルと比較してください)。

SQLiteDatabase.cs

(元の投稿にはありません-クエリ句を汎用ハンドラーの再利用可能なメソッドに縮小しました):

   public IEnumerable<T> Find<T>(Func<T, bool> whereClause, int resultsToSkip, int resultsToShow)
          where T : BusinessLayer.Contracts.IBusinessEntity, new()
    {
        lock (locker)
        {
            return Table<T>().Where(whereClause).Skip(resultsToSkip).Take(resultsToShow).ToList();
        }
    }

WordRepository.cs

    public static IEnumerable<Word> Find<T>(Func<Word, bool> whereClause, int resultsToSkip, int resultsToShow)
        where T : BusinessLayer.Contracts.IBusinessEntity, new()
    {
        var result = me.db.Find<Word>(whereClause, resultsToSkip, resultsToShow);

        return result;
    }

WordServices.cs

この時点で、なぜこれほど多くのレイヤーが必要なのか疑問に思っています。definitleyは午前中にリファクタリングを検討します。

    public static IList<Word> Find<T, U>(Func<Word, bool> whereClause, Func<Word, U> orderBy, bool ascending,  int show, int page)
    {
        int resultsToShow = show;
        int resultsToSkip = show * (page - 1);

        var result = ascending ? WordRepository.Find<Word>(whereClause, resultsToSkip, resultsToShow).OrderBy(orderBy)
                               : WordRepository.Find<Word>(whereClause, resultsToSkip, resultsToShow).OrderByDescending(orderBy);

        return result.ToList();
    }

発信元の呼び出し

   var wordTest1 = WordServices.Find<Word, DateTime>(x => x.ChildId == 1, x => x.AddedAt, true, 5, 1);
于 2012-09-01T20:51:26.920 に答える