2015-12-21 3 views
0

Учитывая следующие C# код ниже, я пытаюсь получить все континенты, имеющими провинции, чьи города включают в себя:RavenDB: как писать запросы о внуках?

  1. город с названием и адресом, соответственно, установленное в «Aloma» и «123» и
  2. другого город с именем и адресом соответственно установлен на «Hemane» и «435».

public class Continent 
{ 
    public string Name { get; set; } 
    public List<Country> Countries{ get; set; } 
} 

public class Countries 
{ 
    public string Name { get; set; } 
    public List<Province> Provinces{ get; set; } 
} 

public class Province 
{ 
    public string Name { get; set; } 
    public List<Province> Cities { get; set; } 
} 

public class City 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

Я пытался использовать ниже запрос, но это не похоже на работу. Не могли бы вы мне помочь?

Expression<Func<Province, bool>> matchCities = rec => 
     (rec.Cities.Count(fi => fi.Name == "Aloma" && fi.Address== "123") > 0) 
     && (rec.Cities.Count(fj => fj.Name == "Hemane" && fj.Address== "435") > 0); 

Func<Province, bool> funcMatchCities= matchCities.Compile(); 

var results3 = session.Query<Continent>() 
         .Where(top => top.Countries.Any(ta => ta.Province.Any(
            rec => funcMatchCities(rec)))) 
         .OfType<Continent>() 
         .ToList(); 

ответ

0

Вы можете запросить его следующим образом:

var results3 = session.Query<Continent>() 
         .Where(top => top.Countries.Any(ta => ta.Province.Any(
           rec => 
     (rec.Fields.Any(fi => fi.Name == "Aloma" && fi.Address== "123")) 
     && (rec.Fields.Any(fj => fj.Name == "Hemane" && fj.Address== "435")))) 
         .OfType<Continent>() 
         .ToList(); 

Обратите внимание, что вы не Compile выражения могут при отправке их поставщику Linq.

+0

Большое спасибо за ваш ответ. Ваш запрос работает, когда он находит провинцию с городами «Алома» и «Гемане». Но он также работает, когда он находит первую провинцию с городом под названием «Алома» и еще одну провинцию с городом под названием «Гемане», в то время как ни одна из этих двух провинций не включает в себя два города. Как я могу предотвратить выполнение запроса во втором случае? –

+0

Итак, как сделать следующую работу: var query = session.Query () .Where (top => top.Countries.Any (ta => ta.Provinces.Any (rec => (rec.Cities.Where) fi => fi.Name == "Aloma" && fi.Address == "123") .Intersect() && rec.Cities.Where (fj => fj.Name == "Hemane" && fj.Address == " 435 "))))) .OfType () .ToList(); –