2017-03-04 2 views
0

Hallo Ich schreibe linq Abfrage um Daten aus mehreren Tabellen zu erhalten. Ich versuche, Array von Objekten wie unten zu erhalten.Wie man Array von linq zurückgibt?

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; } 
    } 

In der obigen Abfrage habe ich geschrieben, wo c.processid == "10". Also gibt es mehrere Datensätze in NCT_Templates mit processid 10. Ich möchte Array mit all diesen Datensätzen zurückgeben. Ich habe Array wie folgt in meiner benutzerdefinierten Klasse erstellt. Ich habe diese Abfrage

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(); 

Ich habe diese eine weitere Abfrage

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(); 

Innen arrayofTemplates I Aufzeichnungen NCT_Templates speichern möchten. Jede Hilfe wäre willkommen. Vielen Dank.

Antwort

2

Eine .ToArray() wird den Job nach Ihrer Abfrage erledigen.

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(); 

aktualisieren

I Empfehlen Sie ICollection anstelle eines Arrays verwenden. da Sie das Array die Lösung oben erläutert, aber es ist besser verständlich, wenn gewünscht verwenden Sie 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; } 
} 

dann eine Sammlung erstellen und auf dem Grundstück passieren wie:

var list = retObj.ToList(); 

aktualisieren

Da das Array im JSON-Objekt Eigenschaften zurückgibt, empfehle ich, ein anderes Modell zu erstellen. und übergeben Sie den Wert direkt an ein Objekt dieser Klasse. wie unten:

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;} 
} 
+0

Vielen Dank. Ich habe meine Frage bearbeitet. Ich weiß nicht, wie ich den Eigenschaften Werte zuweisen kann. Ich habe das Beispielobjekt oben veröffentlicht. –

+0

@NiranjanGodbole aktualisiert :), denken Sie daran, wenn das Array mehr als einen Satz von Daten zurückgibt, müssen Sie ICollection wie oben verwenden – Valkyrie

+0

Danke für Ihre Zeit. templateFileId wird in meinem Fall mehr als eine Zeile haben. Wie kann ich den Eigenschaften von templateFileId Werte zuweisen? Zum Beispiel habe ich geschrieben ID = c.id, title = c.title, version = c.version so wie dies kann ich Werte zu url zuweisen, Name usw. –

Verwandte Themen