2013-08-21 30 views
2

所以我有以下查詢。 我真的很想把它們合併成1個查詢。 旁邊的事實,這導致了一個空的集合(它不應該) 當我試圖將其作爲1查詢時,我的大腦剛剛崩潰。我如何將這些查詢合併爲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; 


    } 


} 
+1

你爲什麼試圖讓你的代碼更有效地失敗?首先,如果有必要,讓它成功,效率低下。 –

+0

沒有試圖讓它失敗更成功。除了修復它,我想修復它正確的方式。 – Puzzle84

+0

不要擔心在使其正確之前使其更快。這就是所謂的「過早優化」。 –

回答

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"); 
} 
0

你有沒有用 「讓」 關鍵字考慮?

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

它也似乎你可以採取的「除」功能中受益

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

(因爲我沒有信譽做出評論,你爲什麼重用變量「ID」爲用戶和識別比賽?)

另外的建議是你可以過濾單人內

var race = entities.Races.Single(r => r.Id == raceId); 
+0

我沒有,不知道它存在現在看起來。 – Puzzle84

+0

很棒。有時你需要第二雙眼睛。現在看這個。好吧,沒有解決它,因爲我正在測試與第一個用戶,我沒有趕上,早些時候:D。 lookinf現在讓 – Puzzle84

0

我想提出以下假設:

  • 你有id,用戶ID
  • 你有raceId,比賽的ID被註冊了
  • 有一個entities.RacingHorses收集這是種族和馬身份協會

然後你可以使用:

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 =用戶的馬
  • rhsh
  • = RacingHorses協會如果raceId出現在rhs,然後h是簽署了那場比賽;不要選擇這h
+0

這是非常正確的假設:D現在測試:D實際上有輕微的變化。每場比賽都有賽馬收藏。我沒有一個賽馬的實體,但比賽 – Puzzle84

+0

@ Puzzle84如果一個種族有一個馬的集合,一匹馬是否也有一個種族集合(或RaceID)? – nmclean

+0

沒有。馬有一個id Race有一個id。種族有一個馬id的集合。也許我應該加入這匹馬來規避這種情況 – Puzzle84