我有一个逗号分隔的值(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查询从数据库中删除所有记录?
答案 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();