LINQ-从数组中删除数据库表中的行

时间:2018-07-27 13:23:38

标签: c# linq

我有一个逗号分隔的值(1、2、5、8),我正在将它们转换成这样的数组

string s =checkboxId.Value;
int[] nums = Array.ConvertAll(s.Split(','), int.Parse);

我要删除所有id为数字的所有行。如何使用LINQ做到这一点?

尝试过:

  foreach(int id in nums)
    {
   DeleteById(id, uid);
   }
   public void DeleteById(int id, string userName)
    {            
        long uid = common.GetUserId(userName);

        IEnumerable<M> idList = dataContext.MD.Where(m => m.ID == id && m.UserId == uid);
        dataContext.MD.DeleteAllOnSubmit(idList);
        dataContext.dc.SubmitChanges();
    }

编辑:  我不想遍历每个数组项。有没有一种方法可以方便地传递数组并通过LINQ查询从数据库中删除所有记录?

5 个答案:

答案 0 :(得分:1)

将其解析为IEnumerable。使用排除的值创建新的列表,然后在方法RemoveAll中使用谓词将其删除。

一个例子:

        string s = checkboxId.Value;
        var nums = s.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToList();
        var toBeRemoved = new List<int>{1, 2, 5};
        var numberOfRemovedItems = nums.RemoveAll(toBeRemoved.Contains);

答案 1 :(得分:1)

我认为这应该有效:

string s = checkboxId.Value;
int[] nums = Array.ConvertAll(s.Split(','), int.Parse);

 var uid = 1234;

 // I prefer LINQ syntax.  The lambda syntax is fine too.
 var idList = from m in dataContext.MD
              where m.UserId == uid && nums.Contains(m.id)
              select m;

dataContext.MD.DeleteAllOnSubmit(idList);
dataContext.SubmitChanges();

答案 2 :(得分:0)

您可以使用linq执行此操作:

var arr = s.Split(',').Where(n => n != checkboxId.Value)
                      .Select(n => Convert.ToInt32(n))
                      .ToArray();

答案 3 :(得分:0)

您有一个字符串import itertools gammas = [1.0,2.0,6.0,5.0,8.0,4.0] print([sum(x) for x in itertools.combinations(gammas,2)]) >>>>[3.0, 7.0, 6.0, 9.0, 5.0, 8.0, 7.0, 10.0, 6.0, 11.0, 14.0, 10.0, 13.0, 9.0, 12.0]

将此字符串转换为1,2,5,8的数组。你可以这样做。如果您的字符串仅包含int,请注意。

int

接下来,您要删除int string s = "1,2,5,8"; var arrayInt = s.Split(',').Select(int.Parse); 数组中的所有这些数字。

ids

答案 4 :(得分:0)

选择以下选项即可获取Uid:

var toDelete = checkboxId.Value
    .Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries)
    .Select( x => {
        int parsedInt= 0;
        var isInt = int.TryParse(x , out parsedInt);
        return new {isInt, parsedInt}
    })
    .Where(x => x.isInt)
    .Select(x=> new {Id= x.parsedInt, Uid=common.GetUserId(x.parsedInt)});

foreach(var item in toDelete)
{
    dataContext.MD.DeleteAllOnSubmit(
        dataContext.MD
            .Where(m => m.ID == item.Id && m.UserId == item.Uid)
        )
}
dataContext.dc.SubmitChanges();

或者不进行int.TryParse检查:

var toDelete = checkboxId.Value
        .Split(',')
        .Select(int.Parse)
        .Select(x=> new {Id= x.parsedInt, Uid=common.GetUserId(x.parsedInt)})

对我来说,最好的方法是在dbml中的对象之间建立适当的链接。因此,您可以从一个物体移动到另一个物体,并且不需要common.GetUserId()m.ID == item.Id && m.UserId == item.Uid).First()。 完成之后,您可以简单地:

var idToDelete = checkboxId.Value
        .Split(',')
        .Select(int.Parse);

var entitiesToDelete = dataContext.MD
                        .Where(x => toDelete.Contains(x.Id));


dataContext.MD.DeleteAllOnSubmit(entitiesToDelete);
dataContext.SubmitChanges();