C# 删除记录并有条件地删除其他LINQ

C# 删除记录并有条件地删除其他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)删除

假设我有以下课程:

现在,我想删除一组ModuleBlock

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来提出这个问题。如果我知道如何进行查询,我可以填写toBeDeletedBlockstoBeDeletedBlockLanguages

然后我就可以这样做了

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);