将 LINQ 用于 Inner Join() 方法

Posted

技术标签:

【中文标题】将 LINQ 用于 Inner Join() 方法【英文标题】:Using LINQ for Inner Join() method 【发布时间】:2015-03-30 21:45:03 【问题描述】:

我有两张桌子:

public class Game

    public int GameId  get; set; 
    public int FirstTeamId  get; set; 
    public int GoalsFirstTeam  get; set; 
    public int GoalsSecondTeam  get; set; 
    public int SecondTeamId  get; set; 

    public Team Team  get; set; 

public class Team

    public int Id  get; set; 
    public string Name  get; set; 

    public IEnumerable<Game> Games  get; set; 

然后,使用:

       OperationDataContext dt = new OperationDataContext();
    public ActionResult Scores()
    
        List<Games> model = dt.Games.ToList();
        var query = (from g in dt.Games
                     join t1 in dt.Teams on g.FirstTeamId equals t1.Id
                     join t2 in dt.Teams on g.SecondTeamId equals t2.Id
                     select new Games()g.GameId, 
                                        t1.Name, 
                                        g.GoalsFirstTeam, 
                                        g.GoalsSecondTeam, 
                                        t2.Name
                                        
                     ).ToList();
        model = query;
        return View(model);

我想要在 View 中最终实现的目标是:

比赛 FirstTeam 进球 进球 SecondTeam

1 罗马 1 3 曼彻斯特

2 国际米兰 0 0 米兰

有人可以帮我解决这个问题,因为我收到了错误通知吗?

PS。当我尝试这个时:

OperationDataContext dt = new OperationDataContext();
    public ActionResult Scores()
    
        var games = dt.Games.ToList();

        return View(games);
    

结果是:

比赛 FirstTeam 进球 进球 SecondTeam

1 罗马 1 3 罗马

2 国际米兰 0 0 国际米兰

【问题讨论】:

错误通知到底是什么? Class Game 不适合容纳您执行的 linq 查询产生的结果。 是的,我看到了这个错误通知:无法使用集合初始化程序初始化“Tournament20.Models.Games”,因为它没有实现“System.Collections.IEnumerable”。简单地说,我不明白如何解决它。 这是纯 linq(linq 到对象)吗?还是实体框架?如果它的实体框架,那么你应该只提供适当的导航属性。 【参考方案1】:

变化:

 select new Games() g.GameId,
                     t1.Name, 
                     g.GoalsFirstTeam, 
                     g.GoalsSecondTeam, 
                     t2.Name
                    

匿名类型:

select new  GameId = g.GameId,
             Team1 = t1.Name,
             Team2 = t2.Name,
             Team1Goals = g.GoalsFirstTeam, 
             Team2Goals = g.GoalsSecondTeam                 
             

您还可以定义一个新类型 - GameResult,它包含上述字段。

【讨论】:

select new GamesResult GameId = g.GameId, FirstTeamId = t1.Name, FirstTeamId = t2.Name, Team1Goals = g.GoalsFirstTeam, Team2Goals = g.GoalsSecondTeam - 它不起作用,因为 GamesResult - 未定义。如何和/或在哪里定义新类型 - GameResult?我在哪里可以读到这个,因为我不太擅长它? ))【参考方案2】:

正如 Erik 建议的那样,您可以改进您的模型

public class Game

    public int Id  get; set; 

    public int FirstTeamId  get; set; 
    public virtual Team FirstTeam  get; set; 

    public int GoalsFirstTeam  get; set; 
    public int GoalsSecondTeam  get; set; 

    public int SecondTeamId  get; set; 
    public virtual Team SecondTeam  get; set; 

    //What does this mean??
    public Team Team  get; set; 



public class Team

    public int Id  get; set; 
    public string Name  get; set;

那你就可以这样查询你的数据了

OperationDataContext dt = new OperationDataContext();
public ActionResult Scores()

    var query = dt.Games.Select(g=> new 
                   
                       Game = g.Id,
                       FirstTeam = g.FirstTeam.Name,
                       Goals_FT = g.GoalsFirstTeam,
                       Goals_ST = g.GoalsSecondTeam,
                       SecondTeam = g.SecondTeam.Name
                   
    return View(query.ToList());

希望它是清晰和有帮助的, 亚历山德罗

【讨论】:

谢谢,我试试这个方法。 public Team Team get; set; - 它是 Game 类中引用 Team 类的导航属性。 好的,对于每个导航属性,您都需要一个 id。在这种情况下,您有团队 1 和 2 的 NP,因此您不需要最后一个团队 NP

以上是关于将 LINQ 用于 Inner Join() 方法的主要内容,如果未能解决你的问题,请参考以下文章

带有 WHERE 子句的 SQL INNER JOIN 到 LINQ 格式

使用 LINQ 的 INNER JOIN 3 数据表

Linq GroupJoin (join...into) 导致 INNER JOIN?

linq left join ,inner join ,crossjoin

你如何在 Linq 中写一个带有“OR”的 INNER JOIN

EF Core Inner join 改为 Left