Linq To实体:根据一组值检查多列
本文关键字:一组 检查 实体 To Linq | 更新日期: 2023-09-27 18:25:04
我有一个MySQL数据库,我正试图用实体框架查询它。
我有一个匹配表,看起来像这样:
match_id、winning_hero1、winning_hero2、winning-hero3、winning/hero4、winning_ero5
其中winning_ hero由整数标识。
给出了一个英雄id列表,我想返回所有这些英雄都在获胜队伍中的比赛。
像这样的东西:
public List<MatchEntity> GetAllMatchesWithWinningHeroes(List<int> heroList)
{
List<MatchEntity> matchList = null;
using (var context = new dotaEntities())
{
switch (heroList.Count)
{
case 1:
matchList = context.MatchEntities.Where(m => m.winning_hero1 == heroList[0]
|| m.winning_hero2 == heroList[0]
|| m.winning_hero3 == heroList[0]
|| m.winning_hero4 == heroList[0]
|| m.winning_hero5 == heroList[0]).ToList();
break;
case 2:
matchList = context.MatchEntities.Where(m => (m.winning_hero1 == heroList[0]
|| m.winning_hero2 == heroList[0]
|| m.winning_hero3 == heroList[0]
|| m.winning_hero4 == heroList[0]
|| m.winning_hero5 == heroList[0])
&& (m.winning_hero1 == heroList[1]
|| m.winning_hero2 == heroList[1]
|| m.winning_hero3 == heroList[1]
|| m.winning_hero4 == heroList[1]
|| m.winning_hero5 == heroList[1])).ToList();
break;
case 3:
//etc..
}
return matchList;
}
}
有没有一种"更好"的方式来选择这些比赛?
谢谢。
您需要的是:
using (var context = new dotaEntities())
{
var matchList = context.MatchEntities.Where(m =>
heroList.Contains(m.winning_hero1) &&
heroList.Contains(m.winning_hero2) &&
heroList.Contains(m.winning_hero3) &&
heroList.Contains(m.winning_hero4) &&
heroList.Contains(m.winning_hero5)).ToList();
}
但是,你的数据设计是错误的。在Match表中,您应该只有MatchID(PK),可能还有MatchName或MatchDate,而在Hero表中,你应该有HeroID(PK,HeroName,。。。然后,您应该有第三个表(MatchHero),以便在两个表之间创建多对多关系。在MatchHero表中,您将拥有MatchID和HeroID。
我想这就是你想要的:
using (var context = new dotaEntities())
{
matchList = context.MatchEntities.Where(m=>
( heroList.Contains(m.winning_hero1)?1:0 +
heroList.Contains(m.winning_hero2)?1:0 +
heroList.Contains(m.winning_hero3)?1:0 +
heroList.Contains(m.winning_hero4)?1:0 +
heroList.Contains(m.winning_hero5)?1:0
) == heroList.Count
).ToList();
}
这假设所有winning-heros都是不同的。