0

我已经搜索了网络并且无法找到在两个 SharpRepository 存储库之间进行连接的任何示例。任何人都可以提供指向页面或示例的链接吗?我正在尝试将以下 linq 表达式转换为清晰的 repo 表达式:

        var user = (from f in _context.AccountUsers
                    join h in _context.Users on f.UserId equals h.UserId
                    where f.AccountId == accountId && h.UserName.Contains(email)
                    select new
                    {
                        h
                    });
        return (IEnumerable<User>)user;

- - - 更新 - - -

这是我想出的,但它似乎并没有正常工作......

            var aur = new AccountUserRepository();
        var user = this.Join(aur, u => u.UserName.Contains(email), au => au.AccountId == accountId, 
            (u, au)=> u).AsQueryable().AsEnumerable();
        return user;
4

1 回答 1

1

存储库中有一个类似于 LINQ Join 语句的 Join 方法,可以让您将一个 IRepository<> 与另一个 IRepository<> 连接起来。你向它传递一个 IRepository<> 来加入,一个内部键选择器,一个外部键选择器和一个结果选择器。

您可以在此处查找使用它的集成测试:https ://github.com/SharpRepository/SharpRepository/blob/master/SharpRepository.Tests.Integration/RepositoryJoinTests.cs

此调用的结果是另一个存储库,然后您可以调用 GetAll 或 FindAll 等,就像它是一个普通的 IRepository<> 本身一样。所以我认为你会想做这样的事情:

var accountUserRepo = new AccountUserRepository();
var userRepo = new UserRepository();

// join on the UserId column that is common to both, and select an anonymous type with both pieces of info (you would select just what you need)
var compositeRepo = accountUserRepo.Join(userRepo, au => au.UserId, u => u.UserId, (au, u) => new { AccountUserInfo = au, UserInfo = u } );

return compositeRepo.FindAll(x => UserInfo.UserName.Contains(email) && x.AccountInfo.AccountId == accountId, x => x.UserInfo);

这就是我认为您会使用 Join 语法的方式。

如果您像在 EF 中一样拥有导航属性,您可能只需执行以下更简单的语法:

return accountUserRepo.FindAll(x => x.AccountId == accountId && x.User.UserName.Contains(email), x => x.User);
于 2013-09-10T21:58:21.663 回答