2015-12-13 129 views
1

我試圖加載,這不是在「FileObjectMetaData」表CodeFluent.Basically這個職位轉換查詢CodeFluent引用的所有「標籤」記載:Codefluent加載所有未引用記錄

Elegant way to delete rows which are not referenced by other table

我有這個表的關係:

CodeFluent Table Relationships

我如何能夠達到這種效果呢?

編輯一:

這是一個許多人在CodeFluent模型一對多的關係,所以在實際生成的SQL表有一個包含中間連結表:

  • TAG_ID
  • FileObjectMetaData_ID

Tag和FileObjectMetaData表本身沒有外鍵彼此直接。

編輯二:

最終,我選擇了主動C#方法這一點,因爲似乎沒有被使用CodeFluent CFQL了堅實的方式。

public static TagCollection LoadUnusedTags() 
{ 
    TagCollection unusedTags = new TagCollection(); 
    TagCollection allTags = TagCollection.LoadAll(); 
    foreach (Tag aTag in allTags) 
    { 
     FileObjectMetaDataCollection fileObjectMetaDatas = FileObjectMetaDataCollection._LoadByTag(aTag.Name); 
     if (fileObjectMetaDatas.Count < 1) 
      unusedTags.Add(aTag); 
    } 
    if (unusedTags.Count < 1) 
     return null; 
    return unusedTags; 
} 

回答

1

解決方案1:使用CFQL方法

enter image description here

LOAD() RAW 

SELECT $Tag{Columns}$ 
FROM $Tag$ 
WHERE $Tag::Id$ NOT IN 
     (
     SELECT [Tag_Id] 
     FROM [FileObjectMetadata_Tag_Tag] 
     WHERE [Tag_Id] IS NOT NULL 
    ) 

這將產生下面的存儲過程:

CREATE PROCEDURE [dbo].[Tag_LoadUnused]() 
AS 
SET NOCOUNT ON 
SELECT [Tag].[Tag_Id],[Tag].[Tag_Name],[Tag].[_trackLastWriteTime],[Tag].[_trackCreationTime],[Tag].[_trackLastWriteUser],[Tag].[_trackCreationUser],[Tag].[_rowVersion] 
FROM Tag 
WHERE [Tag].[Tag_Id] NOT IN 
     (
     SELECT [Tag_Id] 
     FROM [FileObjectMetadata_Tag_Tag] 
     WHERE [Tag_Id] IS NOT NULL 
    ) 
RETURN 
GO 

解決方案2:使用視圖

您可以創建一樣做上述CFQL方法的觀點:

enter image description here

然後你可以使用此視圖從CFQL方法:

load() from UsusedTag 

生成的SQL視圖和存儲過程:

CREATE VIEW [dbo].[vTagUsusedTag] 
AS 
SELECT [Tag].[Tag_Id],[Tag].[Tag_Name],[Tag].[_trackLastWriteTime],[Tag].[_trackCreationTime],[Tag].[_trackLastWriteUser],[Tag].[_trackCreationUser],[Tag].[_rowVersion] 
FROM Tag 
WHERE [Tag].[Tag_Id] NOT IN 
     (
     SELECT [Tag_Id] 
     FROM [FileObjectMetadata_Tag_Tag] 
     WHERE [Tag_Id] IS NOT NULL 
    ) 
GO 

CREATE PROCEDURE [dbo].[Tag_LoadFromView]() 
AS 
SET NOCOUNT ON 
SELECT DISTINCT [vTagUsusedTag].[Tag_Id], [vTagUsusedTag].[Tag_Name] 
    FROM [vTagUsusedTag]  
RETURN 
GO 
+0

這不起作用,因爲我的FileObjectMetaData表中沒有「FileObjectMetadata_Tag_Id」,也沒有「$ FileObjectMetadata :: Tag $」。 請參閱我的第一個編輯。 – Oniisaki

+0

我編輯了我的答案。雖然仍然可以使用「目標名稱轉換」來獲取多對多表格及其列的名稱,但它更復雜,因此我更願意直接使用表名稱。 – meziantou

+0

由於此方法不使用CFQL,因此如果屬性命名格式發生變化,這將在沒有任何人知道的情況下中斷。 因此,我只使用C#方法。 (現在我的解決方案添加到編輯二) – Oniisaki

相關問題