将 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 国际米兰
【问题讨论】:
错误通知到底是什么? ClassGame
不适合容纳您执行的 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 GroupJoin (join...into) 导致 INNER JOIN?
linq left join ,inner join ,crossjoin