Codefluent 加载所有未引用的记录
Codefluent Load All Unreferenced Record
我正在尝试加载 "FileObjectMetaData" table 中未引用的所有 "tag" 记录,并使用 CodeFluent.Basically 将查询从 post 转换为代码流畅:
Elegant way to delete rows which are not referenced by other table
我有这个 table 关系:
我怎样才能达到这种效果?
编辑一:
在CodeFluent模型中是多对多的关系,所以在实际生成的SQLtables中有一个中间链接table包含:
- Tag_ID
- FileObjectMetaData_ID
Tag 和 FileObjectMetaData table 本身没有直接相互的外键。
编辑二:
最后,我选择采用 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:使用 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
我正在尝试加载 "FileObjectMetaData" table 中未引用的所有 "tag" 记录,并使用 CodeFluent.Basically 将查询从 post 转换为代码流畅:
Elegant way to delete rows which are not referenced by other table
我有这个 table 关系:
我怎样才能达到这种效果?
编辑一:
在CodeFluent模型中是多对多的关系,所以在实际生成的SQLtables中有一个中间链接table包含:
- Tag_ID
- FileObjectMetaData_ID
Tag 和 FileObjectMetaData table 本身没有直接相互的外键。
编辑二:
最后,我选择采用 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:使用 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