RavenDB:如何将查询转换为lucene查询

本文关键字:查询 转换 lucene RavenDB | 更新日期: 2023-09-27 18:27:51

我有以下代码:

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; }
}

我想将以下查询转换为lucene查询(例如,Where,Any),这样我就可以获得Aloma和Hemane都在同一个省(而不是不同的省)的大陆,地址分别为123和435:

 var queryResults = from continent in session
                              .Advanced.DocumentQuery<Continent>()
                               from country in continent.Countries
                               from prov in country.Provinces
                               let cities_ = prov.Cities
                               let fi = cities_.Where(fp => fp.Name == "Aloma" && fp.Address == "123").FirstOrDefault()
                               let fj = cities_.Where(fk => fk.Name == "Hemane" && fk.Address == "435").FirstOrDefault()
                               where fi != null && fj != null
                               select continent;

我最初尝试了以下操作,但当Aloma和Hemane在同一个省(我想要的)时,它会返回结果,但当Aroma和Hermane在不同的省(我不想要的):

var queryResultsLucene = session.Advanced.DocumentQuery<Continent>()
                                 .Where("Countries,Provinces,Cities,Name:Aloma")
                                 .AndAlso()
                                 .Where("Countries,Provinces,Cities,Address:123")
                                 .Intersect()
                                  .Where("Countries,Provinces,Cities,Name:Hemane")
                                 .AndAlso()
                                 .Where("Countries,Provinces,Cities,Address:435")
                                 .OfType<Topic>()
                                 .ToList();

你能帮帮我吗?提前感谢

RavenDB:如何将查询转换为lucene查询

我会使用RavenDB上响应中的Lucene查询:如何转换会话。查询会话。高级文档查询。不过我不会在很多城市使用这个。

 var continentsToFindByCity = new List<City>(){new City{Name = "Aloma", Address = "123"}, new City{Name = "Hemane", Address = "435"}};
 var results = new List<Continent>();

    foreach(var city in continentsToFindByCity)
    {
        var tempResults = session.Advanced.DocumentQuery<Continent>().Where(
            string.Format("Countries,Provinces,Cities,Name: {0} AND Countries,Provinces,Cities,Address: {1}", city.Name, city.Address)).ToList();
        if(tempResults.Count > 0)
            results.AddRange(tempResults);
    }

您可以使用以下查询:

var queryResults = session.Advanced.DocumentQuery<Continent>()
                    .OpenSubClause()
                        .WhereEquals("Countries,Provinces,Cities.Name", "Aloma")
                        .AndAlso()
                        .WhereEquals("Countries,Provinces,Cities.Address", "123")
                    .CloseSubClause()
                    .AndAlso()
                    .OpenSubClause()
                        .WhereEquals("Countries,Provinces,Cities.Name", "Hemane")
                        .AndAlso()
                        .WhereEquals("Countries,Provinces,Cities.Address", "Hemane")
                    .CloseSubClause()
                    .ToList();