2013-02-17 61 views
2

在我的WinForm应用程序我用下面的代码来查找用户:LINQ到实体返回所有行

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 server:

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] 

什么问题,我怎么能fi x主题?

+2

你find方法应被宣布为'公共虚拟TEntity查找(表达式>谓词)' – nemesv 2013-02-17 16:33:42

+0

@nemesv:这属于下面的答案部分。 – Slauma 2013-02-17 16:40:27

回答

3

Where函数将多个类型的重载定义为扩展方法。

随着Func<TEntity, bool> predicate你正在调用Enumerable.Where它评估你的客户端过滤,这就是为什么它不会产生正确的查询。

你需要的是接受一个Expression<Func<TSource, bool>> predicate

Queryable.Where方法那么改变你Find方法签名:

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