0

ジェネリックメソッドのリポジトリを持っています

 public IQueryable<TEntity> Populate<TEntity1>(Func<TEntity, TEntity1> predicate)
    {
        return (IQueryable<TEntity>)_objectSet.Select(predicate);
    }

そしてこのメ​​ソッドを呼び出すクラス

 public IDictionary<int,string> Populatelist()
    {
        var dic =_repository.Populate<DTO.Category>(category => new { category.CategoryID, category.CategoryName }).ToList();

        return dic.ToDictionary(c => c.CategoryID, c => c.CategoryName);

    }

しかし、なぜそれが表示されているのかわかりません

式タイプの述語を変換できません:category => new {category.CategoryID、category.CategoryName}は、タイプDTO.Categoryを返します

何か推測?

4

4 に答える 4

1

使用する

_repository.Populate(category => ...

それ以外の

_repository.Populate<DTO.Category>(category => ...

また、戻り値の型はPopualteおそらく である必要がIQueryable<TEntity1>あり、キャストは削除する必要があります。


説明

以下の方法

public IQueryable<TEntity> Populate<TEntity1>(Func<TEntity, TEntity1> predicate)

引数としてaを除きFunc<TEntity, TEntity1>ます。

したがって、このメソッドをDTO.CategoryasTEntity1で呼び出すpredicateと、Func<TEntity, DTO.Category>.

を呼び出しますが、引数はでは.Populate<DTO.Category>なく、新しい匿名型を返す式です。Func<TEntity, DTO.Category>category => new { category.CategoryID, category.CategoryName }

したがって、エラー メッセージは、 を返す関数を想定しているため、式を変換できないことを明確に示していますDTO.Category


結論

DTO.CategoryはちょうどTEntityあなたのものだと思います_repository

したがって、型パラメーターを省略したいだけです。

var dic =_repository.Populate(category => new { category.CategoryID, category.CategoryName }).ToList();

したがって、の型パラメーターはPopulate<TEntity1>コンパイラーによって推論されます。これは、式で作成した無名型になります。

于 2012-07-13T07:43:23.187 に答える
1
    public IQueryable<TEntity1> Populate<TEntity>(Func<TEntity, TEntity1> predicate)
    {
        return (IQueryable<TEntity1>)_objectSet.Select(predicate);
    }

    public IDictionary<int, string> Populatelist()
    {
        var dic = _repository.Populate<DTO.Category>(category => new DTO.Category() { category.CategoryID, category.CategoryName }).ToList();

        return dic.ToDictionary(c => c.CategoryID, c => c.CategoryName);

    }

これが役立つことを願っています。Lambdaexpression では、匿名型の代わりに new DTO.Category() を使用します。

于 2012-07-13T07:14:44.273 に答える
0

よく解決策が見つかりました...署名は

List<TResult> Populate<TResult>(Expression<Func<TEntity, TResult>> predicate);

リポジトリ クラスでの実装

public List<TResult> Populate<TResult>(Expression<Func<TEntity, TResult>> source)
{
        return _objectSet.Select(source).ToList();
}

ビジネスロジックからこれを使用します。

    public IDictionary<int,string> Populatelist( )
    {

        var expectedResult =_repository.Populate(category => new {category.CategoryID, category.CategoryName}).ToList();

        return expectedResult.ToDictionary(c => c.CategoryID, c => c.CategoryName);

    }

問題は、戻り値の型が匿名であるため、値を渡すときに問題が発生していたため、戻り値の型がリスト型の Tresult であるため、キャスト エラーが発生しませんでした..

于 2012-07-15T05:17:15.800 に答える
-2

メソッドの戻り値の型は IQueryable ですが、代わりにメソッドが
TEntity に変換できない匿名型 new { category.CategoryID, category.CategoryName } を返しています。

また、
return _objectSet.Select(predicate).AsQueryable();を使用する方が安全だと思います。

述語は、アイテムがテストに合格したかどうかを示す bool を返すことによってアイテムを区別するラムダを意味するため (たとえば、Where 拡張メソッドの述語パラメーター)、述語はパラメーターの適切な名前ではありませ

于 2012-07-13T07:21:54.500 に答える