【问题标题】:Transporting LINQ query response from C# to JavaScript as dictionary将 LINQ 查询响应从 C# 传输到 JavaScript 作为字典
【发布时间】:2020-02-03 14:01:10
【问题描述】:

我正在使用 Vue 创建一个网站页面,但由于 C#-JS 交叉,我遇到了数据解析问题。

其中一个 C# 后端文件从数据库接收作业数据:

IEnumerable<JobClasses> jobs = await dbContext.JobClasses.Where(x => x.CaseId == caseID).ToListAsync();

解析成对应的对象:

public JobClasses 
{
    public string ClassName { get; set; }
    public string PayrollName { get; set; }
    public int ID { get; set; }
}

反过来,其中一些字段将被提取到更大的类中:

public Company
{
    public string Name { get; set; }
    public string Title { get; set; }
    public Data Data { get; set; }
    public object[] JobClass { get; set; }
}

我需要Company 中的JobClass 来保存多个ClassName-PayrollName 对,以便稍后在我的Company 的详细信息页面上显示它们。由于每个Company 都有很多JobClasses,我不确定要使用什么对象。

我考虑过使用JobDetail 数组,其中JobDetail 包含ClassNamePayrollName,如下所示:

JobDetail[] jobsDetails = jobs.Select(x => x.ClassName, x.PayrollName);

但尽管进行了很多谷歌搜索和语法摆弄,我还是找不到让它工作的方法。

我也试过

var jobArray = from j in jobs select new { j.ClassName, j.PayrollName };

因为 IEnumerable 在 JavaScript 中不存在,所以后来出现错误。

我的问题是:从 LINQ 查询接收数据对的理想方式是什么,以便它们可以顺利地通过 C# 传递到 JavaScript 中,而无需稍后进行任何额外的解析?

【问题讨论】:

  • 可以添加一些测试用例吗?
  • @aloisdgmovingtocodidact.com 什么样的测试用例?如,数据示例?
  • 输入/输出示例主要是:en.wikipedia.org/wiki/Test_case
  • 你如何序列化这个以传递给 JavaScript?因为 yes IEnumerable 不存在,但您将传入与数据等效的 something。大概是物化的集合。那么这只是序列化如何完成的问题 - 我希望将 IEnumerable 转换为 List/array,然后将其转换为 JS 将识别为数组的东西。
  • 我认为您在这里陷入困境......数据将以您在 C# 中拥有的结构发送到 JavaScript。然后,您可以在 JavaScript 中随心所欲地操作它。您不会收到错误,因为 JavaScript 中不存在 IEnumerable; C# 不知道关于 JavaScript 的深蹲。不过,C# 很乐意将 IEnumerable 转换为 JSON 中的数组语法。您只想展平您的对象模型吗?

标签: javascript c# linq vue.js parsing


【解决方案1】:

没有足够的代表发表评论,所以我会尝试回答。 我稍微调整了你的课程。没有类关键字。我还建议像 Company 那样对类名使用一致的单数。为了保持一致性,我还从 JobsClass 中删除了类后缀

所以你有你的 Job 类...

public class Job 
{
    public string Name { get; set; }
    public string PayrollName { get; set; }
    public int ID { get; set; }
}

...和您的 Company 类:

public class Company
    {
        public string Name { get; set; }
        public string Title { get; set; }
        public object Data { get; set; }
        public IEnumerable<Job> Jobs { get; set; }
    }

您使用该语句从数据库中提取的数据...

IEnumerable<JobClasses> jobs = await dbContext.Jobs.Where(x => x.ID == jobID).ToListAsync();

... 应该产生这样的对象(在这里从头开始创建):

        List<Job> jobs = new List<Job>
        {
            new Job
            {
                Name = "Foo",
                PayrollName = "PrFoo",
                ID = 1
            },
            new Job
            {
                Name = "Bar",
                PayrollName = "PrBar",
                ID = 2
            },
        };

现在,如果您还有一个公司对象,您可以简单地将您的工作列表分配给它:

Company company = new Company
            {
                Name = "Acme Inc",
                JobClasses = jobs
            };

当通过例如将公司对象从 C# 传递到 JS 时...

return JsonConvert.SerializeObject(company);

...你最终得到了这个 JSON 对象:

{
   "Name":"Acme Inc",
   "Title":null,
   "Data":null,
   "Jobs":[
      {
         "Name":"Foo",
         "PayrollName":"PrFoo",
         "ID":1
      },
      {
         "Name":"Bar",
         "PayrollName":"PrBar",
         "ID":2
      }
   ]
}

所以你有你的公司对象和一系列你可以迭代的工作。 可能这会有所帮助,我希望你不介意我摆弄你的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2012-11-07
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多