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

标签 c# linq

所以我有以下疑问。 我真的很想将这些合并到 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;


    }


}

最佳答案

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

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

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

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

(既然我没有发表评论的名誉,你为什么要为用户和识别种族重复使用变量“id”?)

额外的建议是您可以在 Single 中进行过滤

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

关于c# - 我如何将这些查询合并为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18347020/

相关文章:

c# - 如何隐藏 WPF 元素以与自动化框架一起正常工作?

c# - SqlDataAdapter.Fill() 与 DataTable.Load()

c# - 一些帮助理解 "yield"

c# - HttpContext.Request 来自列表框的项目?

.net - 在没有第一个元素的情况下返回 list<T> 的最简单方法

C# 在字符串数组中查找最常见的字符串

c# - SoundEffect.CreateInstance是否每次都从文件加载?

c# - Task.WhenAll 返回列表而不是数组

c# - 将 LambdaExpression 转换为字符串,包括值

c# - 使用 Linq 返回逗号分隔的字符串