当前位置: 首页 > 编程语言 > C#

建议使用CastleActiveRecord插入多行并忽略任何作弊行分享

时间:2023-04-10 14:20:20 C#

建议使用CastleActiveRecord插入多行并忽略任何作弊行存储用户感兴趣的烹饪食谱,类似于Netflix的电影队列).用户可以立即查看一堆食谱并排队。我有这样的代码:[WebMethod]publicvoidEnqueueRecipes(SecurityCredentialscredentials,Guid[]recipeIds){使用(newTransactionScope(OnDispose.Commit)){foreach(GuidridinrecipeIds){DB.QueuedRecipeqr=newDB.QueuedRecipe(Guid.NewGuid(),user,newDB.Recipe(rid));qr.Create();}}}我有一个唯一的UserId/RecipeId约束,所以用户只能将一个食谱排入队列一次。但是,如果他们碰巧选择了一个已经在队列中的菜谱,我真的不想用错误消息来打扰用户,我只想忽略菜谱。如果违反唯一约束,上述代码将抛出SQLException。解决此问题的最佳方法是什么,只需忽略重复行即可。我目前的想法是:Castle或NHibernate框架是否还有其他小技巧?另外,我的SQL后端是PostgreSQL9.0。谢谢!更新:我尝试了第一种方法,它似乎工作正常。我碰巧不必加载整个队列,只需加载recipeIds中的队列即可。我相信我的foreach()循环现在是O(n^2),这取决于List::Contains()的效率,但我认为这可能适合我将要使用的大小。//检查欺骗DB.QueuedRecipe[]dbRecipes=DB.QueuedRecipe.FindAll(Expression.In("Recipe",(fromrinrecipeIdsselectnewDB.Recipe(r)).ToArray()));列出现有=(从dbRecipes中的r选择r.Recipe.RecipeId).ToList();使用(newTransactionScope(OnDispose.Commit)){foreach(GuidridinrecipeIds){if(existing.Contains(rid))continue;DB.QueuedRecipeqr=newDB.QueuedRecipe(Guid.NewGuid(),user,newDB.Recipe(rid));qr.Create();您可以使用单个SQL语句执行此操作:SELECT只返回不存在的行,所以它只在这种情况下被插入。批量插入的解决方案如果你想一次插入一长串食谱,你可以:CREATETEMPTABLEi(userIdint,recipeidint)ONCOMMITDROP;插入i值(1,2),(2,4),(2,4),(2,7),(2,43),(23,113),(223,133);INSERTINTOuser_recipeSELECTDISTINCTi.*--从插入候选中删除重复项FROMiLEFTJOINuser_recipeuUSING(userid,recipeid)WHEREu.useridISNULL;一次插入少量记录的解决方案Mike评论说,临时表对于少量记录来说太过分了。以上是C#学习教程:推荐使用CastleActiveRecord插入多行,忽略任何作弊行。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——INSERTINTOuser_recipeSELECTi。*FROM(SELECTDISTINCT*--仅当您需要从(VALUES(1::int,2::int),(2,3),(2,4),(2,4)中删除可能的重复项时--dupe将被删除,(2,43),(23,113),(223,133))i(userid,recipeid))iLEFTJOINuser_recipeuUSING(userid,recipeid)WHEREu.useridISNULL;网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: