【问题标题】:how to return array from linq?如何从 linq 返回数组?
【发布时间】:2017-03-04 11:01:49
【问题描述】:

您好,我正在编写 linq 查询以从多个表中获取数据。我正在尝试获取如下对象数组。

   processobject retObj = new processobject();
 retObj =(from c in entityObject.NCT_Process
    join user in entityObject.NCT_UserRegistration on c.createdUserId equals user.User_Id
     join file in entityObject.NCT_FileUpload on c.iconfileId equals file.upld_ID 
    join templObj in entityObject.NCT_Templates on c.ID equals templObj.processId
   where c.processid == "10"
   select new processobject
    {
    id = c.ID,
    code = c.code,
    flochartContent = c.flowchartContent,
    //arrayofTemplates array i want to return
    }
    );
    public class processobject
    {
    public templatesObject[] arrayofTemplates { get; set; }
    public int id { get; set; }
    public string flochartContent { get; set; }
    public string code { get; set; }
    }

在上面的查询中,我写了c.processid == "10" 的条件。所以NCT_Templates 中存在多条记录,processid 10。我想返回包含所有这些记录的数组。我在自定义类中创建了如下数组。 我有这个问题

 processobject retObj = new processobject();
retObj = (from c in entityObject.NCT_Process
                                  join user in entityObject.NCT_UserRegistration on c.createdUserId equals user.User_Id
                                  join file in entityObject.NCT_FileUpload on c.iconfileId equals file.upld_ID
                                  into filesObjFirst
                                  from wt1 in filesObjFirst.DefaultIfEmpty()
                                  join templObj in entityObject.NCT_Templates on c.ID equals templObj.processId
                                  into filesObj
                                  from wt in filesObj.DefaultIfEmpty()
                                  where c.ID == dbObject.ID
                                  select new processobject
                                  {

                                      id = c.ID,
                                      code = c.code,
                                      flochartContent = c.flowchartContent,
                                      name = c.name,
                                      parentId = c.parentId,
                                      projectId = c.projectId,
                                      objectives = c.objectives,
                                      displayOrder = c.dispalyOrder,
                                      iconFileId = c.iconfileId,
                                      level = c.level,
                                      iconFileobj = new iconFile
                                      {
                                          id = wt1.upld_ID,
                                          name = wt1.fileName,
                                          url = wt1.filePath
                                      },
                                      description = c.description,
                                      startCriteria = c.startCriteria,
                                      endCriteria = c.endCriteria,
                                      reporting = c.reporting,
                                      output = c.output,
                                      kpi = c.kpi,
                                      procedureHistory = c.procedureHistory,
                                      role = c.role,
                                      duration = c.duration,
                                      owner = c.owner,
                                      visibility = true,
                                      createdUserId = c.createdUserId,
                                  }).FirstOrDefault();

我还有这个问题

 templatesObject[] templatesobject = (from c in entityObject.NCT_Templates
                                                             where c.processId == dbObject.ID
                                                             join file in entityObject.NCT_FileUpload on c.templateFileId equals file.upld_ID
                                                             into filesObjFirst
                                                             from wt1 in filesObjFirst.DefaultIfEmpty()
                                                             select new templatesObject
                                                             {
                                                                 id = c.id,
                                                                 title = c.title,
                                                                 version = c.version,
                                                                 visible = c.visibility,
                                                                 filesObj = new iconFileTemplate()
                                                                 {
                                                                     id = wt1.upld_ID,
                                                                     url = wt1.filePath,
                                                                     name = wt1.fileName
                                                                 }
                                                             }).ToArray();

arrayofTemplates内部我想存储NCT_Templates的记录。 任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: c# arrays linq asp.net-mvc-4


    【解决方案1】:

    .ToArray() 将在您查询后完成这项工作。

       processobject retObj = new processobject();
     retObj =(from c in entityObject.NCT_Process
        join user in entityObject.NCT_UserRegistration on c.createdUserId equals user.User_Id
         join file in entityObject.NCT_FileUpload on c.iconfileId equals file.upld_ID 
        join templObj in entityObject.NCT_Templates on c.ID equals templObj.processId
       where c.processid == "10"
       select new processobject
        {
        id = c.ID,
        code = c.code,
        flochartContent = c.flowchartContent,
        //arrayofTemplates array i want to return
        }
        );
    
    var arr = retObj.ToArray();
    

    更新

    我建议您使用 ICollection 而不是数组。因为你想要数组,所以上面解释了解决方案,但如果你使用ICollection,它更容易理解:

    public class processobject
    {
    public ICollection<processobject> processobject{ get; set; }
    public int id { get; set; }
    public string flochartContent { get; set; }
    public string code { get; set; }
    }
    

    然后创建一个集合并将其传递给如下属性:

    var list = retObj.ToList();
    

    更新

    由于 json 对象中的数组返回属性,我建议您创建另一个模型。并将值直接传递给此类的对象。如下:

    public class processobject
    {
    public templateFileId templateFileId{ get; set; }
    public int id { get; set; }
    public string flochartContent { get; set; }
    public string code { get; set; }
    }
    
    public class templateFileId
    {
      public int id {get; set;}
      public string url {get; set;}
      public string name {get; set;}
      public int created {get; set;}
    }
    

    【讨论】:

    • 谢谢。我编辑了我的问题。我不知道如何为属性赋值。我已经在上面发布了示例对象。
    • @NiranjanGodbole 已更新 :),请记住,如果数组返回多组数据,您需要如上所述使用 ICollection
    • 感谢您的宝贵时间。在我的情况下,templateFileId 将有不止一行。如何将值分配给 templateFileId 的属性。例如,我写了 id = c.id, title = c.title,version = c.version 所以像这样我如何为 url、name 等赋值
    • @NiranjanGodbole 在您的查询中。您可以根据 TemplatefileId 进行选择,将数据分配给新类,例如:new templateFileId { id = c.Id, url = c.Url, name = c.Name, created = c.Created }
    • 我已经选择了新的 processobject 我如何添加新的 templateFileId
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多