Witam,
Mam taki mały problem: (tutaj przyklad):
Mam klasę User (identityUser), w której mam relationship many-to-many do "friends'ów" (czyli tej samej klasy).
// tutaj zmienne typu email, id etc pominąłem
public ICollection<UserUser> FriendWith { get; set; }
public ICollection<UserUser> FriendOf { get; set; }
oraz klase łączącą UserUser:
public class UserUser
{
public virtual User User { get; set; }
public string UserId { get; set; }
public virtual User Friend { get; set; }
public string FriendId { get; set; }
public bool Confirmed { get; set; }
}
W EF modelBuilder mam:
modelBuilder.Entity<UserUser>()
.HasKey(k => new {k.UserId, k.FriendId});
modelBuilder.Entity<UserUser>()
.HasOne(pt => pt.User)
.WithMany(p => p.FriendWith)
.HasForeignKey(pt => pt.UserId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<UserUser>()
.HasOne(pt => pt.Friend)
.WithMany(t => t.FriendOf)
.HasForeignKey(pt => pt.FriendId)
.OnDelete(DeleteBehavior.Restrict);
Bez problemu pobieram "friendsow" itp ale zaciąłem się kiedy chciałbym podać np email któregoś usera i otrzymać z powrotem listę wszystkich userów ale żebym mógł sprwadzić jaką ma wartość Confirmed dla danego usera w stosunku do ID zalogowanego usera (w many-to-many) i ustawic w zwracanym modelu. Czy da się to zrobić w jedym zapytaniu czy muszę to jakoś rozbić?
na chwilę obecną mam:
var users = await _userManager.Users
.Where(u => (u.Email.Contains(request.substring) || u.UserName.Contains(request.substring)) && u.Id != request.Id)
.Select(user=> new UserInfo()
{
// tutaj tworze model z danymi ktore potrzebuje
confirmed = isConfirmed // tutaj potrzebuję ustawic na true/false/null
})
.ToListAsync(cancellationToken);
Do pobierania User'a z firiend-listy używam:
.SelectMany(e => e.FriendWith, (user, friend) =>
Z góry dziękuję za pomoc.
Zaciąłem się na tym nie wiem dlaczego...
Edit:
Czy cos w stylu:
.Include(s => s.FriendOf)
a później przy tworzeniu modelu:
.Select(user => new UserInfo()
{
confirmed = user.FriendOf.FirstOrDefault(e => e.FriendId == request.Id).Confirmed
})
czy takie działania są poprawne??
Edit 2:
Działać->działa ale czy tak to się robi "profesjonalnie" czy może jest jakiś lepszy sposób?
Ostatecznie mam:
var users = await _userManager.Users
.Include(s => s.FriendWith)
.Where(u => (u.Email.Contains(request.substring) || u.UserName.Contains(request.substring)) && u.Id != request.Id)
.Select(user => new UserInfo()
{
confirmed = user.FriendWith.FirstOrDefault(e => e.FriendId == request.Id).Confirmed
}).ToListAsync(cancellationToken);