Pracuję z matrycą wypełnioną podobieństwami między przedmiotami. Zapisuję je jako listę obiektów w mojej bazie danych. Obiekt Podobieństwo wygląda następująco:Warunkowe GroupBy() w LINQ
public class Similarity
{
public virtual Guid MatrixId { get; set; } //The id of the matrix the similarity is in
public virtual Guid FirstIndex { get; set; } //The id of the item of the left side of the matrix
public virtual Guid SecondIndex { get; set; } //The id of the item of the top side of the matrix
public virtual double Similarity { get; set; } //The similarity
}
Użytkownik może przeglądać te pozycje. Chcę pobrać listę pozycji, które są "podobne" do pozycji, które użytkownik sprawdził. Problem polega na tym, że nie jestem w stanie stwierdzić z całą pewnością, czy identyfikator elementu ma wartość FirstIndex
lub SecondIndex
. Napisałem kod, który robi to, co chcę, ale chcę wiedzieć, czy jest to możliwe w 1 instrukcji.
var itemsNotReviewed = Similarities.Where(x => !itemsReviewed.Contains(x.SecondIndex))
.GroupBy(x => x.SecondIndex)
.ToList();
itemsNotReviewed.AddRange(Similarities.Where(x => !itemsReviewed.Contains(x.FirstIndex))
.GroupBy(x => x.FirstIndex)
.ToList());
Gdzie itemsReviewed
jest lista identyfikatorów GUID o elementach użytkownik dokonał przeglądu i gdzie Similarities
znajduje się lista wszystkich przedmiotów, które są podobne do elementów użytkownik przeglądowi. Odzyskać tę listę z tej funkcji:
return (from Row in _context.SimilarityMatrix
where itemIds.Contains(Row.FirstIndex) || itemIds.Contains(Row.SecondIndex)
select Row)
.Distinct()
.ToList();
gdzie itemIds
jest lista identyfikatorów GUID o elementach użytkownik przeglądowi.
Czy istnieje sposób grupowania według pierwszego lub drugiego indeksu na podstawie klauzuli Where?
Proszę dać mi znać, jeśli powinienem opracować!
Nadzieja [połączyć Where i grupy przez w LINQ] (http: // stackoverflow.com/a/802337/3796048) może pomóc –
@MohitShrivastava jak ustalić, który indeks jest kluczem do grupowania? – RandomStranger