【问题标题】:How to query a List<T>?如何查询 List<T>?
【发布时间】:2014-06-29 01:40:17
【问题描述】:

我是 ASP.net 和 LINQ 的新手,但是教程很短。我正在创建一个 Web API 项目,并在我的模型下创建了一个名为 gender 的类,如下所示。

public class Gender
{
    public int Id { get; set; }
    public string Description { get; set; }
    public Language LanguageId { get; set; }
    public int InternalCode { get; set; }
    public bool isActive { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
}

我还没有创建链接到它的数据库,也没有使用实体框架,因为我还在学习它。我在控制器操作中创建了一个性别列表,仅用于培训目的。当我尝试使用 LINQ 查询列表以便能够返回正确的对象时,我在下面的 var query = from gen in Gender 行收到编译器错误,我不知道为什么。

    // Show
    // URI GET + api/Gender/id/
    [HttpGet]
    public Gender Gender(int id)
    {
        var genders = new List<Gender>();

        genders.Add(new Gender { Id = 1, Description = "Male" });
        genders.Add(new Gender { Id = 2, Description = "Female" });

        var query = from gen in Gender
                       where gen.Id == id 
                       select gen;
        return query;
    }

【问题讨论】:

    标签: c# asp.net linq asp.net-web-api


    【解决方案1】:

    试试

        var query = from gen in genders
                       where gen.Id == id 
                       select gen;
    

    查询你的列表,genders,而不是Gender的类型

    然后您可以通过以下方式返回单个项目:

     return query.FirstOrDefault();
    

    当然,您可以通过以下方式压缩所有这些:

    return genders.FirstOrDefault(gen => gen.Id == id);
    

    【讨论】:

    • 没什么大不了的,但是如果Id是数据库中的主键,SingleOrDefault应该更合适。为一个项目提供一个 ID 并获得另一个共享该 ID 的返回听起来不正确。
    • 不一定。 SingleOrDefault 暗示合同(它必须是唯一的)并且可能会招致性能损失,因为它(理论上)必须检查所有条目以确保只有一个条目。您应该询问是否要在“查询”时间而不是“写入”时间执行合同。另请参阅此处的other questions
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2019-04-13
    相关资源
    最近更新 更多