Mam obiekt o nazwie Strona, z instancją o nazwie p, która ma niestandardową właściwość o nazwie AssociatedAttributes. Jeśli wykonuję następujące czynności:Czy ktoś może wyjaśnić mi dokładnie krzyż LINQ? Nie rozumiem, dlaczego to nie zadziała
int numMatchingAttributes = p.AssociatedAttributes.Intersect(p.AssociatedAttributes).Distinct().Count();
Funkcja numMatchingAttributes kończy się na wartości równej 0, mimo że p ma 6 Asocjacji Associated. Dlaczego nie jest równy 6?
AssociatedAttributes
jest typu List<Attribute>
(Attribute
jest moje własne klasy, nie System.Attribute
) i Attribute
realizuje IComparable<Attribute>
, nie mam go wdrożyć IEquatable
, powinienem?
Jest to realizacja CompareTo
w atrybucie:
public int CompareTo(Attribute other)
{
return Id.CompareTo(other.Id);
}
Id
jest typu Guid
.
ten jest własnością AssociatedAttributes na stronie:
public List<Attribute> AssociatedAttributes
{
get
{
List<Attribute> list = new List<Attribute>();
using (
PredictiveRecommendor dbContext =
new PredictiveRecommendor()){
if (dbContext != null)
{
IQueryable<Attribute> query = from a in dbContext.PageAttributes
where a.Page.Id.Equals(this.Id)
select a.Attribute;
list = query.ToList();
}
}
return list;
}
}
(dbContext jest Telerik kontekst OpenAccess)
Aktualizacja: Oto, co skończyło się pracę: na stronie jest następująca metoda:
public int numberOfIntersectedAssociatedAttributes (Page other)
{
using (PredictiveRecommendor dbContext = new PredictiveRecommendor())
{
IQueryable<Attribute> thisAssocAttributes = from a in dbContext.PageAttributes
where a.Page.Id.Equals(this.Id)
select a.Attribute;
IQueryable<Attribute> otherAssocAttributes = from a in dbContext.PageAttributes
where a.Page.Id.Equals(other.Id)
select a.Attribute;
IQueryable<Attribute> interSection = thisAssocAttributes.Intersect(otherAssocAttributes);
return interSection.ToList().Count;
}
}
To brzydkie, ale działa.
hmm, ale potrzebuję faktycznych odniesień do już istniejących obiektów atrybutów. Nie mogę po prostu wygenerować nowych. To może zadziałać tylko po to, by uzyskać liczbę punktów przecięcia, ale nie byłoby zbyt wiele, gdyby były nowo zbudowanymi obiektami. Zrobiłem tylko przecięcie strony z samym sobą, aby sprawdzić, czy poprawnie koduję. – cray1
@ user1911333 Nie mówię, że powinieneś to zrobić, mówię, że myślę, że już to robisz (lub coś podobnego) jako wyjaśnienie twojego obserwowanego zachowania. Jeśli odpowiedziałeś [moje pytanie] (http://stackoverflow.com/questions/18365587/can-someone-explain-linqs-intersect-properly-to-me-i-dont-understand-white-this#comment26965710_18365587) o tym, jak właściwość jest zaimplementowana, może nie muszę zgadywać. Nie mówię, że twój kod * powinien * wyglądać tak; w rzeczywistości prawdopodobnie nie powinien. Gdyby tak było, byłoby to całkiem ... niezwykłe. – Servy
Po dodaniu implementacji mogę konkretnie powiedzieć, że faktycznie konstruujesz nowe instancje obiektów w geterze i to jest twój problem. Opcje 1 lub 3 są prawdopodobnie najlepszym wyborem dla ciebie. Obiekt ORM jest prawdopodobnie zmienny, a także, ogólnie rzecz biorąc, nie powinno się przesłonić metod 'Equals' lub' GetHashCode'. – Servy