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

时间:2015-10-22 21:42:26

标签: c# asp.net-mvc linq

我有一个函数,它根据单独的选择返回id列表。此函数返回所有ID,它们在视图中显示为复选框。一旦我选择了一些复选框,它们就会以逗号分隔的字符串的形式保存到数据库中。编辑选择时,用户需要能够取消选中所选复选框并选择其他复选框。我遇到的问题是如何将复选框设置为已存在于数据库中逗号分隔字符串中的复选框。我有一个linq语句创建一个字符串数组,但我不知道如何根据它们的ID检查数组中的任何复选框。

以下是ViewModel中的函数:

http_build_query()

视图中的Foreach循环:

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

1 个答案:

答案 0 :(得分:0)

来自您之前的question以及my answer there :) 你可以

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为selectedIds添加新属性

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

并在GET Edit操作中添加此

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