如何在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的定义
我太笨了,不知道我做错了什么
创建thisObj
的调用需要键入。例如:
var thisObj = new ObjectDataItem() {InternalID = objQuery.InternalId,
blobType = objQuery.blobType,
objectName = objQuery.objName,
ObjectDesc = objQuery.objDesc};
作为旁注,我建议在命名方面保持一致——即使这是一个一次性脚本。公共属性/字段通常大写,而内部字段/局部变量以小写开头;字段名objName
在一个地方,objectName
在另一个地方也令人困惑。