2

私のwinformアプリケーションでは、次のコードを使用してユーザーを見つけます:

   var findUser =
                userService.Find(
                    u => u.UserName == UserNameTextBox.Text.Trim() && u.Password == PasswordTextBox.Text.Trim() && u.IsActive);

そして、サービス層でジェネリック メソッドとして実装されているメソッドを見つけます。

public virtual TEntity Find(Func<TEntity, bool> predicate)
{
    return _tEntities.Where(predicate).FirstOrDefault();
}

これを実行すると、次のSQLコードが生成され、SQLサーバーに送信されます。

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[UserName] AS [UserName], 
[Extent1].[Password] AS [Password], 
[Extent1].[IsAdmin] AS [IsAdmin], 
[Extent1].[IsActive] AS [IsActive], 
[Extent1].[RowVersion] AS [RowVersion]
FROM [dbo].[Users] AS [Extent1]

問題は何ですか?どうすればテーマを修正できますか?

4

1 に答える 1

3

このWhere関数には、拡張メソッドとして複数のタイプで定義された複数のオーバーロードがあります。

クライアント側でフィルタリングを評価するを呼び出しているため、正しいクエリが生成されませんFunc<TEntity, bool> predicateEnumerable.Where

必要なのはQueryable.WhereExpression<Func<TSource, bool>> predicate

したがって、Findメソッドのシグネチャを次のように変更します。

public virtual TEntity Find(Expression<Func<TEntity, bool>> predicate)
{
    return _tEntities.Where(predicate).FirstOrDefault();
}
于 2013-02-17T16:45:38.873 に答える