【问题标题】:Asp.Net web api - How to get all recordsAsp.Net web api - 如何获取所有记录
【发布时间】:2014-01-11 01:46:45
【问题描述】:

我是 .Net Web API 的新手。

我想获取 CreatedBy = 1 的所有记录(这不是主键)。

我的模特

public class Subject
{
    [Key]
    public int Id { get; set; }
    public int UniId { get; set; }
    public bool IsActive { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public int CreatedBy { get; set; }
    public int UpdatedBy { get; set; }
}

我在Controller中的get方法

public Subject Get(int id)
    {
        IQueryable<Subject> query;
        return query = from Subjects in db.SubjectContext.Where(v => v.CreatedBy == id).ToList();
    }

【问题讨论】:

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


    【解决方案1】:

    主要问题是Controller 中的Get 方法设置为返回单个Subject 对象,而不是List&lt;Subject&gt;。您的查询看起来正确。

    主要变化如下

    public List<Subject> Get(int id)
    {
        IQueryable<Subject> query;
        return query = from Subjects in db.SubjectContext.Where(v => v.CreatedBy == id).ToList();
    }
    

    附带说明,变量名称id 不明确。使用createdById 之类的东西会向不经意的观察者表明id 变量代表创建了许多Subjects 的用户,而不是Subject 的ID。

    而且,对于方法名称Get,我也会说同样的话……明白什么? Get 也与属性声明中使用的 C# 关键字 get 过于接近。它应该更具描述性。只是一些不影响您的问题的快速说明:)

    最后,我会指出您从函数返回的方式是非正统的,尽管在技术上是正确的并且可以编译。您可以跳过 return 语句中的变量赋值,甚至完全跳过使用变量而只返回 List&lt;Subject&gt;.. 我还为 DataContext 添加了一条 using 语句,这是最佳实践:

    public List<Subject> Get(int id)
    {
        using(var context = new YourDataContext())
        {
            var queryResult = (from Subjects in db.SubjectContext.Where(v => v.CreatedBy == id)).ToList();
            return queryResult;
        }
    }
    

    或者没有 LINQ 语句,

    public List<Subject> Get(int id)
    {
        using(var context = new YourDataContext())
        {
            return context.Subjects.Where(v => v.CreatedBy == id)).ToList();
        }
    }
    

    【讨论】:

    • 关于变量名,注意Web API绑定了路由字典中的id变量,所以名字需要和路由模板匹配。
    • 这很好用!说如果我只想要其中的几个字段.. 我该如何更改它?我修改后的 LINQ 查询 - var queryResult = context.SubjectContext .Where(x => x.CreatedBy == CreatedBy) .Select(x => new Subject { x.Id, x.Name });
    • @user2412230 你在正确的轨道上。您的代码应该可以工作,因为您使用的是匿名类型。您还可以定义一个仅包含您需要的字段的类,并在 .Select() 调用中实例化该类。如果需要,这样可以更轻松地传递给其他方法等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2018-03-27
    • 2012-10-24
    相关资源
    最近更新 更多