2017-06-27 3 views
0

Ich habe eine DbSet<DtoProfile>. Jetzt möchte ich meine Profile filtern.Schwierige Entity Framework Abfrage

My Modell:

public class DtoProfile { 
    public IList<DtoLookingFor> LookingFor { get; set; } = new List<DtoLookingFor>(); 
    public virtual DtoSearch Search { get; set; } 
    public Guid? SearchId { get; set; } 
} 
public class DtoLookingFor 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
    public LookingFor LookingFor { get; set; } 
} 
public enum LookingFor 
{ 
    A, B, C, D, E 
} 
public class DtoSearch 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
    public virtual ICollection<DtoLookingFor> LookingFor { get; set; } 
} 

Beispiel: Profile1 hat lookingfor A, B, C und die Suche mit lookingfor B, C
Profile2 hat lookingfor B, D
Profil3 hat lookingfor E
Profile1 sollte Holen Sie sich alle Profile, wo LookingFor B oder C ist. (in Beispiel Profile1 und Profile2)

Wie kann ich dies mit IQueryable<DtoProfile>? Ich habe bereits die DtoSearch widersprochen aus der Datenbank geladen und mit dtoSearch.LookingFor Zugriff auf alle DtoLookingFor

+0

ich eine Lösung hinzugefügt haben, die eine DtoProfile nimmt und die passenden entsprechenden Profile (einschließlich sich selbst - wie man wollte) LMK, wenn es für dich funktioniert oder nicht, was du meintest. –

Antwort

0

ich die Eigenschaften ändern würde „Lookingfor“ genannt, wirklich verwirrend ist, Sie haben zu viele von diesen und es ist auch die Klasse Name.

Dieses Arbeitsbeispiel bringt Sie, wenn Sie Eingabe wählen profile1 -> profile1 + profile2

static void Main(string[] args) 
    { 
     List<DtoProfile> profiles = new List<DtoProfile>(); 
     var profile1 = new DtoProfile 
     { 
      LookingFor = new List<DtoLookingFor> { new DtoLookingFor { LookingFor = LookingFor.A }, new DtoLookingFor { LookingFor = LookingFor.B }, new DtoLookingFor { LookingFor = LookingFor.C } }, 
      Search = new DtoSearch 
      { 
       LookingFor = new List<DtoLookingFor> { new DtoLookingFor { LookingFor = LookingFor.B }, new DtoLookingFor { LookingFor = LookingFor.C } }, 
      }, 
      SearchId = new Guid("10000000-0000-0000-0000-000000000000") 
     }; 

     var profile2 = new DtoProfile 
     { 
      LookingFor = new List<DtoLookingFor> { new DtoLookingFor { LookingFor = LookingFor.B }, new DtoLookingFor { LookingFor = LookingFor.D } }, 
      SearchId = new Guid("20000000-0000-0000-0000-000000000000") 

     }; 

     var profile3 = new DtoProfile 
     { 
      LookingFor = new List<DtoLookingFor> { new DtoLookingFor { LookingFor = LookingFor.E } }, 
      SearchId = new Guid("30000000-0000-0000-0000-000000000000") 

     }; 


     profiles.AddRange(new List<DtoProfile> { profile1, profile2, profile3 }); 

     IEnumerable<DtoProfile> query = GetMatchesForProfile(profiles, profile1); 

     Console.WriteLine("Found: " + string.Join(",", query.Select(m => m.SearchId))); 
     //result: Found: 10000000-0000-0000-0000-000000000000,20000000-0000-0000-0000-000000000000 
    } 

    private static IEnumerable<DtoProfile> GetMatchesForProfile(List<DtoProfile> profiles, DtoProfile profileToMatch) 
    { 
     return profiles.Where(searchProfile => profileToMatch.Search.LookingFor.Any(m => searchProfile.LookingFor.Any(z => z.LookingFor == m.LookingFor))); 
    } 
Verwandte Themen