【问题标题】:Linq query to get the records of a table without using an object of the tableLinq查询不使用表的对象获取表的记录
【发布时间】:2018-12-05 05:59:17
【问题描述】:

我正在使用实体框架 6 来开发我的 c# 应用程序。我已将我的数据模型命名为分配模型,并且我有一个名为 JobTable 的表。

我的数据库模型类如下所示

 public partial class  Allocation : DbContext
    {
        public  Allocation()
            : base("name=Allocation")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
        public virtual DbSet<JOB_Header> JOB_Header { get; set; }
    }

我的工作标题看起来像这样

我的 Job 头类看起来像这个 Job jeader 类是从我的表 Job_header 的实体框架工作模型生成的类

public partial class JOB_Header
    {
        public int JobID { get; set; }
        public string CustomerCode { get; set; }
        public string CustomerName { get; set; }
        public string MobileNo { get; set; }
        public string LocationCode { get; set; }
        public System.DateTime JobDate { get; set; }
        public bool Status { get; set; }
        public string Remarks { get; set; }
    }

如何查询数据以进行以下 sql 查询?

SELECT TOP 1 * FROM JOB_Header ORDER BY JOBID DESC;

select CustomerName from JOB_Header where JobID =1;



using (DataControllers.AllocationJAEntities = new DataControllers.Allocation())
            {
                JHeaderModel = JAEntities.JOB_Header.Where(a => a.JobID == 1).FirstOrDefault();
            }

通常我会获取上述对象的数据。但我需要获取单个字段而不读取数据到为数据模型中的表创建的类的对象,获取对象的所有行详细信息。这样的普通查询如何处理?

【问题讨论】:

    标签: c# sql entity-framework linq linq-query-syntax


    【解决方案1】:
    using (var context = new DataControllers.Allocation())
    {
      var header = context.JOB_Header.OrderByDescending(j => j.JobID).FirstOrDefault();
    }
    

    不确定你的变量名,所以我自己写了

    【讨论】:

    • 这似乎与but i need to get a single field without creating object and getting all for the object相矛盾
    • 正确答案。但是如果你想获得单个字段,那么修改上面的代码:context.JOB_Header.OrderByDescending(j=>j.JobID).Select(e=>e.FieldName).FirstOrDefault();
    • 老实说,我只是看着将 SQL 翻译成 Linq。我们得看看他们的进展如何。
    【解决方案2】:

    为什么你不能像下面那样选择那个字段。此外,如果您的JobID 是一个关键字段(看起来像),那么我根本不需要FirstOrDefault(),因为Where() 只会返回一条记录

    JAEntities.JOB_Header.Where(a => a.JobID == 1).Select(x => x.CustomerName)
    

    【讨论】:

    • 谁在做这些奇怪的投票
    • @TheGeneral 没有清楚理解问题的人... :)
    • @TheGeneral,拉胡尔是正确的。有了上面你的查询就像 - SELECT name FROM Table Where ID = XX 并且如果你曾经想过使用 find 方法或考虑先找到对象然后返回返回名称,它会像 SELECT * from table where ID = xx 希望它清楚,
    【解决方案3】:

    当我们只想获得您可以通过以下更改进行的名称时。这个概念是当您找到我的KEY 时,最多会有NOOne 记录。那么——

    string name = string.Empty;
    using (DataControllers.AllocationJAEntities = new DataControllers.Allocation())
    {
        name = JAEntities.JOB_Header.Find(1)?.CustomerName;
    }
    

    注意我使用了Find 方法,因为我们使用主键搜索,否则我们也可以使用WHERE

    记住如果你使用 Find 实际上它会像下面的 SQL 查询一样查询你的数据库的完整行 -

    从 Id = 1 的表中选择 *

    意味着您的 DB 整行将返回您的特定 ID,返回到您的代码,然后您正在读取您的 name 属性。

    但是当你想要实现类似下面的 SQL 查询时 -

    SELECT CustomerName FROM table WHERE Key = 1

    对于这种情况,Rahul 的回答是正确的。 -

    string name = string.Empty;
    using (DataControllers.AllocationJAEntities = new DataControllers.Allocation())
    {
        name = JAEntities.JOB_Header
                .Where(a => a.JobID == 1)
                .Select(x => x.CustomerName)
                .FirstOrDefault();
    }
    

    要获得包括订单在内的第一条记录,您可以(如斯蒂芬上面提到的)-

    using (var context = new DataControllers.Allocation())
    {
      var job = context.JOB_Header.OrderByDescending(j => j.JobID).FirstOrDefault();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多