2016-08-08 15 views
0

Ich muss Code hinzufügen, um in vorhandenen Code eine Liste von Objektnamen einzufügen, aus einem Azure Blob Store zu ziehen. Die Sache ist, dass die Tabelle, aus der ich die Liste ziehe, eine Tabelle von Blobnamen in einer SQL Azure DB (AdminDB) ist. Die tatsächliche Liste, die ich erstellen muss, stammt aus einem Aggregat von 3 Tabellen in einer anderen SQL Azure DB (runtimeDB) Ich kann nicht einfach eine JOIN-Abfrage über die beiden durchführen, da die virtualisierten DBs von Azure das nicht zulassen.Wie schreibe ich eine C# -Liste Abfrage über 3 Tabellen in 2 verschiedenen Azure SQL-Datenbanken

Des Weiteren aus Leistungsgründen die runtimedb nicht BlobNames verwenden, sondern verwendet stattdessen ein internalId, die in der runtimedb

in einer Zwischentabelle werden muss nachgeschlagen So habe ich die folgenden C# Definitionen

public partial class adminDb : DbContext 
{ 
    public virtual DbSet<missingObjNames> MissingObjects {get; set;} 
    // contains fields uchar(16) BlobId; 
} 
public partial class runtimeDB: DbContext 
{ 
    public virtual DbSet<myObjects> myObjects {get; set;} 
    // contains fields int InternalId, int blobType uchar() objectName, uchar() objectDesc. 
    public virtual DbSet<idMap> IdMap {get; set} 
    // contains fields int InternalId, uchar(16) BlobId 
    } 

Also habe ich die elegante Lösung aufgegeben und versuche jetzt nur, es brutal zu erzwingen, da ich weiß, dass die Liste höchstens 4k-10k Einträge enthält (das ist DB Cleannup code)

Ich habe die Zugriff auf jede Datenbankdefinition ed als

var runContext = new runtimeDBContextContainer(); 
var adminContext = new adminDBContextContainer(); 

dann gehe ich die Liste der Blob Namen ziehen

var MissingObjList = (adminContext.missingObjects.Select(ss => ss.BlobId)).ToList(); 

var listInternalIds = new List<int.(); 
foreach (myBlobId in MissingObjList) 
{ 
    int blobInternalId = (from r in context.IdMap 
           where r.BlobId == myBlobId 
           select r.InternalId).First(); 
    MissingObjList.Add(blobInternalId); 
} 

So weit, so gut ich am Ende mit einer Liste der internen IDs auf der MyObjects Tabelle I

jetzt ziehen habe einen

Public Class ObjectDataItem 
{ 
    public int InternalId {get; set;} 
    public int? blobType {get; set;} 
    public string objectName {get; set;} 
    public string ObjectDesc {get; set;} 
} 

Also geht der Code dann zu versuchen und eine Liste der fehlenden Objec aufzubauen ts (was der Rest des Update-Codes erwartet) durch Iteration durch die Liste der InternalIds. ja ich weiß - das ist dumm Brute-Force-Code und sein vor allem, weil ich ein n00b bei Verwendung von Linq 3 Tage von MSDN-Tutorials bin nicht mir vielen klüger (ich bin Festsetzung geerbt Code)

var listBlobs = new List<ObjectDataItem>(); 

foreach (var missingBlobId in MissingObjList) 
{ 
    IQUERYABLE <myObjects> objQuery = (from o in runContext.myObjects 
              where o.InteralId = missingBlobId 
              select o); 

    var thisObj = new {objQuery.InternalId, 
         objQuery.blobType, 
         objQuery.objName, 
         objQuery.objDesc}; 

    listBlobs.Add(thisObj); 
    } 

Diese letzten zwei verursachen mir einen Syntaxfehler. im Wesentlichen Intellisense sagt mir, dass mein ObjQuery enthält keine Definitionen der ObjectDataItem bin ich

Aufzählen und ich bin zu viel von einem N00b, um herauszufinden, was ich falsch gemacht habe

Antwort

0

Ihr Anruf thisObj Bedürfnisse zu schaffen eingetippt werden. Z.B .:

var thisObj = new ObjectDataItem() {InternalID = objQuery.InternalId, 
        blobType = objQuery.blobType, 
        objectName = objQuery.objName, 
        ObjectDesc = objQuery.objDesc}; 

Als Randbemerkung, würde ich eine gewisse Einheitlichkeit bei der Benennung Dinge empfehlen - auch wenn dies ein Wegwerf-Skript. Öffentliche Eigenschaften/Felder werden in der Regel groß geschrieben, während interne Felder/lokale Variablen weniger große Anfangsbuchstaben haben. einen Feldnamen an einem Ort und objectName in einem anderen zu haben ist auch verwirrend.

+0

Danke, seinen geerbten Code .. versuchen, mit dem Kontext konsistent zu bleiben –