使用linq检查数组的内容是否在数据库的列中

本文关键字:数据库 是否 linq 检查 数组 使用 | 更新日期: 2023-09-27 18:18:50

我有一个函数,它根据一个单独的选择返回一个id列表。该函数返回所有id,并在视图中显示为复选框。选中一些复选框后,它们将作为逗号分隔的字符串保存到数据库中。在编辑所选内容时,用户需要能够取消选中所选复选框并选择备用复选框。我的问题是如何将复选框设置为在数据库中以逗号分隔的字符串中存在的复选框。我有一个linq语句,它创建了一个字符串数组,但我不确定如何根据它们的ID检查数组中的任何复选框。

以下是ViewModel中的函数:

public IEnumerable<SelectListItem> DocNamesByDocTypeIdList()
{
    using (var db = new ARXEntities())
    {
        IEnumerable<SelectListItem> docName = new List<SelectListItem>();
        docName = (from t in db.vwMapDocNamesToSecurityUsers
                   select new 
                   { 
                       t.DocName, 
                       t.DocNameId, 
                       t.DocTypeId 
                   }).Distinct()
                   .Select(x => new SelectListItem()
                   {
                       Text = x.DocName,
                       Value = x.DocNameId.ToString(),
                       Group = new SelectListGroup() { Name = x.DocTypeId.ToString() }
                   }).Distinct().OrderBy(x => x.Text).ToList();
         var docCount = docName.Count();
         return docName;
    }
}
public String[] GetDocNamesForDocTypeId(int? docTypeId)
{
    var nameCkBoxes = DocNamesByDocTypeIdList().Where(m => m.Group.Name == docTypeId.ToString()).ToString().Split(',');
    //Set the ids in the array as checked in the view?
    return nameCkBoxes;
 }

视图中的Foreach循环:

<div class="ckDocNames">
    @foreach (var dn in Model.GetDocNamesForDocTypeId(Model.DocTypeId))
    {
        <div class="checkboxContainer, editCkBoxes">
            <input class="ckBoxes" type="checkbox" name="DocNameId" value="@dn.Value" dtid="@dn.Group.Name" />@dn.Text<br />
        </div>
    }
</div>

使用linq检查数组的内容是否在数据库的列中

从你之前的问题,也从我的回答:)你可以

public IEnumerable<int> GetDocNamesForFilterId(int id)
{
    using (var db = new ARXEntities())
    {
        var selectedIds = (from t in db.ServiceAccountFilters
                    where t.FilterId == id
                    select t.DocNameId).ToList();
        return selectedIds;
    }
} 

并在FilterModel中为selected did添加新属性

public IEnumerable<int> SelectedDocNames { get; set; }

并在GET Edit Action中添加

var model = new FilterViewModel 
{
   ...
   SelectedDocNames = GetDocNamesForFilterId(serviceAccountFilter.FilterId);
};

,在你的视图中,你应该填充所有的复选框,只勾选之前被选中的,就像下面这样,让用户在编辑模式中选中或取消选中任何一个

@foreach (var dn in Model.DocNamesByDocTypeIdList())
{
    <div class="checkboxContainer">
        <input class="ckBoxes" type="checkbox" name="selectedDocIds" checked="@Model.SelectedDocNames.Contains(int.Parse(dn.Value))" value="@dn.Value" dtid="@dn.Group.Name" />@dn.Text<br />
    </div>
 }

在POST操作中检查用户选择的内容如下

var selectedIds = form.GetValues("selectedDocIds");