C# 删除记录并有条件地删除其他LINQ
假设我有以下课程: 现在,我想删除一组ModuleBlockC# 删除记录并有条件地删除其他LINQ,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,假设我有以下课程: 现在,我想删除一组ModuleBlock var toBeDeletedModuleBlocks = // Query, select ModuleBlocks to be deleted toBeDeletedModuleBlocks的查询可以是任意的,只要它选择ModuleBlocks 对于删除ModuleBlock后ModuleBlock中有0个外键(BID)的每个块,我想删除该块 所以基本上,如果模块块中存在一个不存在的BID,我想删除该块 并使用FK(BID)删除
var toBeDeletedModuleBlocks = // Query, select ModuleBlocks to be deleted
toBeDeletedModuleBlocks的查询可以是任意的,只要它选择ModuleBlocks
对于删除ModuleBlock后ModuleBlock中有0个外键(BID)的每个块,我想删除该块
所以基本上,如果模块块中存在一个不存在的BID,我想删除该块
并使用FK(BID)删除每个BlockLanguage,FK(BID)是要删除的块的主键(BID)
这必须在数据上下文上的onesubmitchange中发生。我已经为此工作了一个小时,但我只是缺乏知识来查询我需要删除的所有内容
最后,我希望能够做到这一点:
var toBeDeletedModuleBlocks =
from moduleBlocks in context.ModuleBlocks
where block.MID == 5 // assume block with MID = 5 exists
select moduleBlocks
// Count of each block referenced by ModuleStrings
var allBlocksCount =
from moduleBlock in context.ModuleBlocks
join block in context.Blocks on ModuleBlock.bID equals block.Bid
group by block by block.BID into counter
select new
{
BID = counter.Key,
Count = counter.Count()
};
// Count of each block that is going to be deleted, in this case it has a maximum of 1 (one module in each where).
var theseBlocksCount =
from moduleBlock in context.ModuleBlocks
join block in context.Blocks on ModuleBlock.bID equals block.Bid
where moduleStrings.MID == 5 // 5 again, these are going to be deleted
groub by
select new
{
BID = count.Key
Count = counter.Count()
}
现在我想比较一下allBlocksCount和theseBlockscount,如果计数相等,这意味着区块字符串中剩下0个引用,所以我想查询一下allBlocksCount和theseBlockscount中计数相等的所有区块(出价)
但我不知道足够多的LINQ来提出这个问题。如果我知道如何进行查询,我可以填写toBeDeletedBlocks和toBeDeletedBlockLanguages
然后我就可以这样做了
Context.ModuleBlocks.DeleteAllOnSubmit(toBeDeletedModuleBlocks);
Context.Blocks.DeleteAllOnSubmit(toBeDeletedBlocks);
Context.BlockLanguages.DeleteAllOnSubmit(toBeDeletedBlockLanguages);
Context.SubmitChanges();
所以基本上,如果存在块中的出价,而块中不存在
ModuleBlock,我想删除那个块
var blocksWithoutModules=
以db.Blocks为单位的from块
哪里db.ModuleBlocks.Any(m=>m.Block==Block)
选择块;
并删除带有作为PK(BID)的FK(BID)的所有BlockLanguage
要挖掘的区块的
var语言删除=
从块中的块开关输出模块
选择block.Language;
这必须通过datacontex上的一次提交更改来实现
您可以使用以下方法一次性删除块
实体的集合:
db.Blocks.deleteAllonsSubmit(blocksWithoutModules);
db.Languages.DeleteAllOnSubmit(languagesToDelete);
db.SubmitChanges();
我不确定这是否可行,但这是您想要的逻辑,对吗
var remainingBlockIds = context.ModuleBlocks.Except(toBeDeletedModuleBlocks)
.Select(mb => mb.BID)
.Distinct();
var toBeDeletedBlocks = context.Blocks.Where(b => remainingBlockIds.Contains(b.BID) == false);
var toBeDeletedBlockIds = toBeDeletedBlocks.Select(b => b.BID);
var toBeDeletedBlockLanguages = context.BlockLanguages.Where(bl => toBeDeletedBlockIds.Contains(bl.BID));
// Then delete toBeDeletedModuleBlocks, toBeDeletedBlocks, and toBeDeletedBlockLanguages
这是删除块语言的替代逻辑。它删除所有没有现有块的块语言,而不管该块是否刚刚被删除。优点是它只依赖于剩余的blockId
var toBeDeletedBlockLanguages = context.BlockLanguages.Where(bl => remainingBlockIds.Contains(bl.BID) == false);
linq到sql?实体框架?此外,还需要创建更好的对象模型。您正在编写类似表的类,而不是适当的域模型。例如,您使用fk而不是关系。拥有这些关系将允许您执行
moduleBlock.Blocks
并使用一种级联删除。您可以解释一下:“对于每个已删除的块,moduleBlock中都有0个键(BID),我想删除该块。”。您当前对toBeDeletedModuleBlocks
的查询是什么。我更新了我的问题,希望现在更容易回答>\u一次调用SubmitChanges
就可以做到这一点吗?在删除块之前,linq to sql能否从数据库中删除块语言?再次更新了我的问题。您的回答假设ModuleBlock已被删除,但事实并非如此。很抱歉,您的回答没有考虑toBeDeletedModuleBlocks。而且我和林克还不是很好。但我相信我最终会找到答案的。我想就是这样,我会在回家后的几个小时内尝试一下
var toBeDeletedBlockLanguages = context.BlockLanguages.Where(bl => remainingBlockIds.Contains(bl.BID) == false);