【问题标题】:LINQ Help for a novice给新手的 LINQ 帮助
【发布时间】:2012-07-03 14:17:06
【问题描述】:

无法得到这个,有人可以帮助这个 LINQ 查询吗?

select col1, 
(select col2 from tbl2 where tbl2.ID=tbl1.tbl2ID) as [col2] 
from tbl1  

场景是这样的

我想要 Jobs 表中的所有记录,Jobs 有扇区 ID 列,我还想要 SectorName。它还有 CountryID 和 CityID,我也需要 CountryName 和 CityName。

【问题讨论】:

  • 你的数据上下文是什么样的? Jobs 表和其他表(Sector?)的数据架构是什么样的?
  • 结构简单。 Jobs 表有几个字段和 SectorID (int),Sectors 表有 SectorName (nvarchar) 和 ID (int, primarykey),Cities 表有 CityName (nvarchar) 和 ID (int, primarykey),国家表有 CountryName (nvarchar) 和 ID (int, 主键)
  • 我根据您解释的三个表格更新了我的答案。
  • 感谢@davidisawesome,但@J Torres 的回答仍然适合我的需要。祝下次好运。我感谢大家在这里的努力。尽情享受吧。

标签: .net sql asp.net-mvc-3 linq


【解决方案1】:

如果关系设置正确,我认为应该是这样的:

var result=from job in Jobs
           select new {job.jobID, job.jobName, job.Sector.SectorName, job.Country.CountryName, job.City.CityName};

【讨论】:

    【解决方案2】:

    你需要做一些加入。不知道您的结构,类似以下的方法可能会起作用。

    创建一个简单的视图模型来保存您的信息:

    public class JobView
    {
        public int JobId { get; set; }
        public string JobName { get; set; }
        //Add any other fields you may need here
        public string SectorName { get; set; }
        public string CityName { get; set; }
        public string CountryName { get; set; }
        public string CityName { get; set; }
    
    }
    

    然后根据您的需要填充一个列表

    List<JobView> retVal = (from job in Jobs
                    join sector in Sectors on job.SectorId equals sector.Id
                    join country in Countries on job.CountryId equals country.Id
                    join city in Cities on job.CityId equals city.Id
                    select new JobView { 
                                    JobId = job.Id,
                                    JobName = job.JobName,
                                    SectorName = sector.SectorName,
                                    CountryName = country.CountryName,
                                    CityName = city.CityName }).ToList();
        }
    

    在 JobView 中定义的任何附加字段只需要在选择期间填充。

    【讨论】:

    • 结构简单。 Jobs 表有几个字段和 SectorID (int),Sectors 表有 SectorName (nvarchar) 和 ID (int, primarykey),Cities 表有 CityName (nvarchar) 和 ID (int, primarykey),国家表有 CountryName (nvarchar) 和 ID (int, 主键)
    • 根据您收到的大量答案,您应该一切顺利。如果您需要一个更优雅的 ORM 解决方案,您可能需要扩展您的问题。根据您的问题,我建议使用某种形式的 ViewModel,它包含您需要的所有列,并按照上面的建议简单地创建一个实例。
    • 我必须说这是一个完美的解决方案。它帮助我克服了视图中的错误threw an exception of type Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
    • 很高兴这对您有所帮助。祝你好运!
    【解决方案3】:

    你应该像这样JOIN这些表:

    from j in Jobs
    join c in Countries on j.CountryID equals c.ID
    join c2 in Cities on c.CityID equals c2.ID
    select new 
    { 
        SectorName = j.SectorName,
        CountryName = c.Name,
        CityName = c2.Name
    };
    

    【讨论】:

    • 我还需要 Jobs 中的列和您添加的 3 列。
    • @OjalSuthar,您可以选择任何您想选择的内容,正如我向您展示的那样,jjobs 表的别名,使用它来选择匿名类型中所需的列select new { j.Whatyouwanttoselect, j.anothercolumn,...}.
    【解决方案4】:

    这是我发现的一个很好的示例,我认为它可以解释您在寻找什么。绝对需要一个 JOIN。

    class Job
    {
    public int ID { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }
    }
    
    class Sector
    {
    public int ID { get; set; }
    public string SectorName { get; set; }
    }
    
    class City
    {
    public int ID { get; set; }
    public string CityName { get; set; }
    }
    
    void Main()
    {
    var jobs = new Job[]
    {
        new Job{ID = 5, Name = "Sam", Title="Minion"},
        new Job{ID = 6, Name = "Dave", Title="Overlord"},
        new Job{ID = 7, Name = "Julia", Title="Minion"},
        new Job{ID = 8, Name = "Sue", Title="Minion"}
    };
    
    // Example orders.
    var sectors = new Sector[]
    {
        new Sector{ID = 5, SectorName = "Sector42"}
    };
    
    var cities = new City[]
    {
        new City{ID = 5, CityName = "TownsVille"}
    };
    
    // Join on the ID properties.
    var query = from j in jobs
            join s in sectors on j.ID equals s.ID
            join c in cities on j.ID equals c.ID
            select new { j.Name, j.Title, c.CityName, s.SectorName };
    
    // Display joined groups.
    foreach (var group in query)
    {
        Console.WriteLine("{0} Is a  {1} in {2}, sector {3}", group.Name, group.Title, group.CityName, group.SectorName);
    }
    
    }
    

    输出看起来像这样(来自 foreach 循环)

    Sam Is a  Minion in TownsVille, sector Sector42
    

    我引用了这个网站:http://www.dotnetperls.com/join

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多