1

我正在尝试使用 CodeFluent 加载“FileObjectMetaData”表中未引用的所有“标记”记录。基本上将查询从这篇文章转换为 CodeFluent:

删除其他表未引用的行的优雅方法

我有这个表关系:

CodeFluent 表关系

我怎样才能达到这种效果?

编辑一:

在 CodeFluent 模型中是多对多关系,因此在实际生成的 SQL 表中,有一个中间链接表,其中包含:

  • 标记_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;
}
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 回答