1

我一直在关注MonoDroid 网站上的Tasky 案例研究,但在创建过滤和排序查询时遇到了困难。我想知道是否有人可以解释我可能会出错的地方吗?我可能正在做一些完全倒退的事情!

我得到错误:

无法从用法中推断出方法“ICanTalk.BusinessLayer.Services.WordServices.Find(System.Func, System.Func, bool, int, int)”的类型参数。尝试明确指定类型参数。

我的一个存储库中有以下代码,希望我想要做的事情很清楚。我还没有能够构建它来测试它是否有效:

  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

几乎做对了,我将其简化为基础知识,然后按照自己的方式重新设计并提出了以下内容(如果您有兴趣,请与原始内容进行比较)。

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 回答
0

您的两种方法都是通用的Find<T,U>,并且Find<T>- 但您似乎没有T在方法定义中的任何地方使用该类型。T预计是类型Word
U在您使用的其他地方按顺序使用一次bool- 这些用法中的哪一个是错误的?

您可以尝试在定义中替换Wordwith和with (如果这是您的意思),然后在调用该方法时实际使用正确的类型调用它吗?TboolU

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