在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中获得我想要的数据。functionId
在ListBoxFor(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
而不是使用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; }
}