在存储库中指定Linq表达式

本文关键字:Linq 表达式 存储 | 更新日期: 2023-09-27 18:10:14

我在我的接口上有一个方法,看起来像:

T GetSingle(Expression<Func<T, bool>> criteria);

我试图模仿这样的设置(我意识到这不起作用):

_mockUserRepository = new Mock<IRepository<User>>();
_mockUserRepository.Setup(c => c.GetSingle(x => x.EmailAddress == "a@b.com"))
    .Returns(new User{EmailAddress = "a@b.com"});

我意识到我向设置传递了错误的参数。
在阅读了这个答案之后,我可以通过在表达式中传递它来工作,像这样:

_mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func<User, bool>>>())
    .Returns(new User{EmailAddress = "a@b.com"});

然而,这意味着如果我用任何表达式调用GetSingle方法,将返回相同的结果。

是否有办法在设置中指定使用哪个表达式?

在存储库中指定Linq表达式

我设法使这个工作:

Expression<Func<User, bool>> expr = user => user.EmailAddress == "a@b.com";
_mockUserRepository.Setup(c => c.GetSingle(It.Is<Expression<Func<User, bool>>>(criteria => criteria == expr)))
    .Returns(new User { EmailAddress = "a@b.com" });
User result = _mockUserRepository.Object.GetSingle(expr);

如果您不介意通用设置,可以像这样更简单。

_mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func<User, bool>>>()))
    .Returns(new User { EmailAddress = "a@b.com" });