我已经在网上搜索过,无法找到在两个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;
答案 0 :(得分:1)
存储库上有一个类似于LINQ Join语句的Join方法,可以让你加入一个IRepository&lt;&gt;与另一个IRepository&lt;&gt;。你传递了一个IRepository&lt;&gt;加入,内键选择器,外键选择器和结果选择器。
您可以在此处查看使用它的集成测试:https://github.com/SharpRepository/SharpRepository/blob/master/SharpRepository.Tests.Integration/RepositoryJoinTests.cs
此调用的结果是另一个存储库,您可以调用GetAll或FindAll等,就像它是普通的IRepository&lt;&gt;一样。本身。所以我想你会想做这样的事情:
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);