我如何将这些查询合并为1

时间:2013-08-21 00:29:09

标签: c# linq

所以我有以下查询。 我真的想将这些合并为1个查询。 接下来这会产生一个空集合(它不应该) 当我尝试将其变成一个查询时,我的大脑刚刚崩溃。

所以如果从代码中不清楚的话 我想从某个用户中选择所有马匹。尚未注册用户试图注册的比赛。

var userhorses = (from h in entities.Horses
                          where h.UserId == id
                          select h);

var race = (from r in entities.Races
                    where r.Id == id
                    select r).Single();

var runninghorses = (from rh in race.RacingHorses
                     where rh.UserId == id
                     select rh);

var nonracinghorses = (from nrh in userhorses
                       from rh in runninghorses
                       where nrh.Id != rh.Id
                       select nrh).ToList();

修改

public class Horse
{
    [Key]
    public int Id { get; set; }

    public int? UserId { get; set; }
    public virtual User Owner { get; set; }

    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
    public int? GenderId { get; set; }
    public virtual Gender Gender { get; set; }
    public int? ColorId { get; set; }
    public virtual Color Color { get; set; }
    public int? LegTypeId { get; set; }
    public virtual LegType LegType { get; set; }
    public int? CharacterId { get; set; }
    public virtual Character Character { get; set; }
    public int Hearts { get; set; }
    public bool Retired { get; set; }
    public bool CPU { get; set; }
    public bool ForSale { get; set; }
    public int ListPrice { get; set; }
    public DateTime? Deadline { get; set; }
    // Parents
    public int? SireId { get; set; }
    public virtual Horse Sire { get; set; }
    public int? DamId { get; set; }
    public virtual Horse Dam { get; set; }
    // Internals
    public int Stamina { get; set; }
    public int Speed { get; set; }
    public int Sharp { get; set; }
    // Special
    public int Dirt { get; set; }
    // Externals
    public int Start { get; set; }
    public int Corner { get; set; }
    public int OutOfTheBox { get; set; }
    public int Competing { get; set; }
    public int Tenacious { get; set; }
    public int Spurt { get; set; }
    //Future
    public virtual ICollection<Race> FutureRaces { get; set; }
    //RaceResults
    public virtual ICollection<RaceResult> RaceResults { get; set; }
    //Training
    public virtual ICollection<Training> TrainingResults { get; set; }
    //Bids
    public virtual ICollection<Bid> Bids { get; set; }

    public Horse() {
        ForSale = false; //default value
        Deadline = null;
    }
}


public class Race
{
    [Key]
    public int Id { get; set; }
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
    [Required(ErrorMessage = "Purse is required")]
    public int Purse { get; set; }
    [Required(ErrorMessage = "Slots are required")]
    public int Slots { get; set; }
    public int SlotPrice { get; set; }
    public DateTime? RaceTime { get; set; }

    //public int? TrackId { get; set; }
    //public virtual Track Track { get; set; }

    public int? OwnerId { get; set; }
    public virtual User Owner { get; set; }

    public virtual ICollection<Horse> RacingHorses { get; set; }

    public virtual ICollection<RaceResult> RaceResults { get; set; }

    public Race()
    {
        SlotPrice = 0; //default value
        Slots = 8;


    }


}

3 个答案:

答案 0 :(得分:0)

您是否考虑过使用“let”关键字?

http://msdn.microsoft.com/en-us/library/bb383976.aspx

您似乎也可以利用“除外”功能

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

(由于我没有发表评论的声誉,为什么要为用户重新使用变量“id”并确定比赛?)

其他建议是您可以在Single

中进行过滤
var race = entities.Races.Single(r => r.Id == raceId);

答案 1 :(得分:0)

我正在做出这些假设:

  • 您有id,用户ID
  • 您有raceId,正在注册的比赛ID
  • 有一个entities.RacingHorses集合,它是种族和马ID的关联

然后你可以使用:

from h in entities.Horses
where h.UserId == id
let rhs = entities.RacingHorses.Where(rh => rh.HorseId == h.Id)
where !rhs.Any(rh => rh.RaceId == raceId)
select h

故障:

  • h =用户的马
  • rhs = h
  • 的RacingHorses协会
  • 如果raceId中出现rhs,则h已注册参加该竞赛;不要选择此h

答案 2 :(得分:0)

所有kudo都会去这个nmclean。

public static SelectList GetNonRacingHorses(int id, int raceId)
{
    HorseTracker entities = new HorseTracker();

    var race = entities.Races.Single(r => r.Id == raceId);
    var racehorses = from h in race.RacingHorses
                     select h.Id;

    var userhorses = (from h in entities.Horses
                      where
                          h.UserId == id
                      orderby h.Name
                      select h);

    var nonracinghorses = from h in userhorses
                          where !racehorses.Contains(h.Id)
                        select h;

    List<SelectListItem> sli = new List<SelectListItem>();

    foreach (Horse horse in nonracinghorses)
    {
        sli.Add(new SelectListItem { Text = horse.Name, Value = horse.Id.ToString(), Selected = false});
    }

    return new SelectList(sli, "Value", "Text");
}