如何在2个不同的Azure sql数据库中跨3个表编写c#列表查询

本文关键字:3个 查询 列表 数据库 2个 sql Azure | 更新日期: 2023-09-27 18:01:24

我需要添加代码以向现有代码提供要从Azure Blob Store中提取的对象名称列表。问题是,我正在拉列表的表是一个SQL Azure DB (AdminDB)中的Blob名称表,而我需要构建的实际列表是从另一个SQL Azure DB (runtimeDB)中的3个表的集合,所以我不能只是跨两个执行JOIN查询,因为Azure的虚拟化DB不允许这样做。

此外,出于性能原因,runtimeDB不使用BlobNames,而是使用内部id,必须在runtimeDB的中间表中查找

所以我有以下c#定义

 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
  }

所以我已经放弃了优雅的解决方案,现在只是试图蛮力它,因为我知道最多列表将包含4k-10k项(这是DB清理代码)

我有访问每个数据库定义为

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

然后拉出blob名称列表

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到目前为止,我结束了一个内部id列表从myObjects表拉

现在我有了一个
Public Class ObjectDataItem
{
    public int InternalId {get; set;}
    public int? blobType {get; set;}
    public string objectName {get; set;}
    public string ObjectDesc {get; set;}
}

因此,代码继续尝试通过遍历internalid列表来构建缺失对象列表(更新代码的其余部分所期望的)。是的,我知道-这是愚蠢的暴力代码,主要是因为我是使用Linq的新手,3天的MSDN教程并没有让我变得更聪明(我正在修复继承的代码)

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

最后两个导致了语法错误。智能感知告诉我,我的ObjQuery不包含我枚举的ObjectDataItem的定义

我太笨了,不知道我做错了什么

如何在2个不同的Azure sql数据库中跨3个表编写c#列表查询

创建thisObj的调用需要键入。例如:

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

作为旁注,我建议在命名方面保持一致——即使这是一个一次性脚本。公共属性/字段通常大写,而内部字段/局部变量以小写开头;字段名objName在一个地方,objectName在另一个地方也令人困惑。