【问题标题】:Subset of query in linq [closed]linq 中的查询子集 [关闭]
【发布时间】:2015-11-11 12:35:24
【问题描述】:

我喜欢执行如下所示的链式查询 我已经给出了大陆 ID,并据此选择了一个:

    var continent = db.Continent.FirstOrDefault(c => c.Id == Continent_Id);

然后我想找到给定大陆的国家子集。 然后我想根据国家 ID 查找给定国家的城市子集。任何想法如何做到这一点? 这些是我的课程:

public class Contient
{
public int Id { get; set; }
public string Name { get; set; }
}   

public class Country
{
public int Id { get; set; }
public string Name { get; set; }
public int ContientId { get; set; }
}
 public class City
{
public int Id { get; set; }
public string Name { get; set; }
public int CountryId { get; set; }
}

【问题讨论】:

    标签: c# linq model-view-controller


    【解决方案1】:

    嗯,首先你需要在你的模型中添加一些navigation properties

    public class Continent
    {
      public int Id { get; set; }
      public string Name { get; set; }
    
      public virtual ICollection<Country> Country{get;set;}//Add this property
    }   
    
    public class Country
    {
      public int Id { get; set; }
      public string Name { get; set; }
      public int ContinentId { get; set; }
    
      public virtual Continent Continent{get;set;}//Add this property
      public virtual ICollection<City> Cities{get;set;}//Add this property
    }
    public class City
    {
      public int Id { get; set; }
      public string Name { get; set; }
      public int CountryId { get; set; }
      public virtual Country Country{get;set;}//Add this property
    }
    

    然后你可以运行这样的查询:

    var countries= db.Countries.Where(c=>c.ContinentId==Continent_Id);
    var cities= countries.SelectMany(c=>c.Cities);
    

    而且,如果你已经拥有大陆,你也可以这样做:

      var continent = db.Continent.FirstOrDefault(c => c.Id == Continent_Id);
      var countries= continent.Countries;
      var cities= countries.SelectMany(c=>c.Cities);
    

    SelectMany 扩展方法会将与每个国家相关的城市扁平化为一个序列。

    更新

    我将向您展示如何在不使用查询中的导航属性的情况下做同样的事情,但我仍然建议您需要将它们添加到您的模型中:

    var continent = db.Continent.FirstOrDefault(c => c.Id == Continent_Id);
    var countries=  db.Countries.Where(c=>c.ContinentId==Continent_Id);
    var countriesId=countries.Select(c=>c.Id).ToList();
    var cities= db.Cities.Where(c=>countriesId.Contains(c.CountryId));
    

    【讨论】:

    • 如果我不能更改模型怎么办?
    • 添加这些导航属性不会影响您的数据库问题。 EF Code First 每个关系至少需要一个导航属性才能在数据库中创建外键约束,如果您不添加至少一个,则 FK 属性将被视为表中的任何其他列。
    【解决方案2】:

    假设你有这样的东西

    Continent[] continents; 
    Country[] countries; 
    City[] cities;
    (...)
    int continentId=5; //just a example
    

    在您的代码中的某个地方就足够了:

    LINQ 查询:

    //Getting Continent
    var quContinents = from continent
                       in continents
                       where country.Id == continentId 
                       select continent
    
    //Getting Countries from Continent
    var quCountries = from country
                      in countries
                      where country.continentID == continentId
                      select country
    
    //go trough all countries which as been found
    foreach(var country in quCountries)
    {
      var quCities = from city
                     in cities
                     where city.countryID == country.Id
                     select city
      //display cities
      foreach (var city in quCities)
        Console.WriteLine(city.Name " in " country.Name);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多