1

「FileObjectMetaData」テーブルで参照されていないすべての「タグ」レコードを CodeFluent でロードしようとしています。基本的に、この投稿のクエリを CodeFluent に変換します。

他のテーブルから参照されていない行を削除するエレガントな方法

私はこのテーブル関係を持っています:

CodeFluent テーブルの関係

どうすればこの効果を達成できるでしょうか?

編集 1:

CodeFluent モデルでは多対多の関係であるため、実際に生成された SQL テーブルには、以下を含む中間リンク テーブルがあります。

  • タグ_ID
  • FileObjectMetaData_ID

Tag および FileObjectMetaData テーブル自体は、相互に直接外部キーを持っていません。

編集 2:

最終的に、CodeFluent CFQL を使用する確実な方法がないように思われるため、これには C# アプローチを採用することにしました。

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

1 に答える 1

1

解決策 1: CFQL メソッドを使用する

ここに画像の説明を入力

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 メソッドと同じことを行うビューを作成できます。

ここに画像の説明を入力

次に、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
于 2015-12-13T12:07:11.267 に答える