在Linq中执行一个值数组,以返回MVC控制器中的特定数据

本文关键字:MVC 返回 控制器 数据 执行 Linq 一个 数组 | 更新日期: 2023-09-27 18:19:48

背景:

我正在使用Linq-to-SQL类来连接我的数据库。

我已设置MyProjectRepo.cs

public IList<SQLTable> GetAllTopicById(int functionId)
{
  var query = from tb in _dataContext.table select tb;
  var content = query.ToList<SQLTbale>();
  return content;
}

IMyProjectRepo.cs

IList<SQLTable> GetAllTopicById(int functionId);

MyProjectModel.cs

public MyProjectModel()
  {
   AvailableFunction = new List<MultiSelectList>();
   AvailableTopic = new List<MultiSelectList>();
  }
  // 1st List box that works properly 
   public IList<MultiSelectList> AvailableFunction{get;set;}
  // 2nd list box that is related with this Question
   public IList<MultiSelectList> AvailableTopic{get;set;}

这些设置工作正常,可以从SQL中获得我想要的数据。functionIdListBoxFor(model=>model.FunctionID, new MultiSelectList(Model.AvailableFunction))中用于检索函数ID的数组,然后将它们传递给下一个ListBoxFor(model=>model.TopicID, new MultiSelectList(Model.AvailableTopic))

由于我想拥有真正的MultiSelect函数,我编写了一个Jquery来收集functionID的所有选择,并将它们作为一个数组,并使用Ajax(我研究过Ajax调用在传递值数组时需要设置traditional:true)将它们传递给我的控制器。

这是我的控制器:

    public ActionResult GetAllTopic(int[] functionId)
      {
        foreach(int i in functionId) 
        {
         var alltopic = _repository.getAllTopicById(i)
         var result = (from at in alltopic
                       where at.function_id = i
                       select new
                       {
                        id= at.topic_id,
                        topicname = at.topic_name
                       }).Distinct().ToList();
    return Json(result, JsonRequestBehavior.AllowGet);
        }
    return View();// If I don't write this return, it will say "not all code paths return a
          // value" Is this because I wrote everything in that Foreach loop?
         }

所以问题是:

这个foreach循环只执行从ajax传递的数组的第一个值。例如:Ajax在数组中返回3个值(functionId{1,3,5}),当我在控制器中放置断点时,我可以在foreach(int i in functionId{1,3,5})中看到这个数组,但它只执行一次(I=1)。我如何让这个控制器工作,以便它可以执行数组中的每个值来获得我想要的数据?

我这样做的原因是,有时这些functionId有一些相同的topic_name,我不希望multiselectlist有那些重复的名称。

例如:

{functionId=1 topic_name=topic1,topic2,topic3}

{functionId=2 topic_name=topic2 topic3 topic4}

{functionId=3 topic_name=topic1、topic3、topic5}

如果用户选择functionId{1,2,3},我希望在返回中看到的是{topic_name=topic1,2,3,4,5}而不是{topic name=1,1,2,2,3,3,4,5}

我知道这在SQL中很容易实现,只需键入where functionId In(1,2,3),但由于我在MVC中使用Linq和JQueryAJAX,我想在存储库中进行匹配和比较功能比在MyProjectRepo.cs中编写复杂的Linq要好。实际上,这没有帮助,因为模型不直接与Ajax对话。

以下是我的逻辑:Linq将整个表返回到我的模型中,并将其传递给_repository.GetAllTopicById,然后我在控制器中声明var alltopic = this _repository.GetAllTopicById,然后我可以将从Ajax收集的ID与该控制器进行匹配。

我希望我写的整个序列能被每个人理解,如果有人有任何解决方案来完成这项工作,或者对我写的某些部分有任何问题,请在下面写一行。如有任何回复,我们将不胜感激!

谢谢!

Kevin

在Linq中执行一个值数组,以返回MVC控制器中的特定数据

而不是使用for each。你能试试这个代码吗?

[Test]
    public void ArrayValueInLinq()
    {
        int[] functionId=new int[]{1,2};
        IList<SQLTable> alltopic=new List<SQLTable>
        {
            new SQLTable
            {
               topic_id=1,
               topic_name="john"
            },
            new SQLTable
            {
               topic_id=1,
               topic_name="john"
            },
            new SQLTable
            {
               topic_id=2,
               topic_name="Tomal"
            },
            new SQLTable
            {
               topic_id=1,
               topic_name="john"
            }
        };
        var result = (from at in alltopic
                      select new
                      {
                          id = at.topic_id,
                          topicname = at.topic_name
                      }).Where(p=>functionId.Contains(p.id)).Distinct().ToList();
    }
    public class SQLTable
    {
        public int topic_id { get; set; }
        public string topic_name { get; set; }
    }