【发布时间】:2017-09-17 10:29:33
【问题描述】:
我觉得我要么很近,要么很远。虽然 MVC5 C# webapp 跌跌撞撞,但已经阅读了一些很好的帮助,但是我似乎无法找到让我得到结果的确切语法。
在我的控制器中,我试图根据字符串的串联过滤我的结果(所以基本上我可以将其转换为数组或列表 - 或者保持原样。不确定)。数组/列表可以是 1 到 14 个变量。控制器如下:
public ActionResult Result(string Person)
{
Hierarchy h = db.Hierarchies.First(i => i.People == Person);
if (h == null)
{
return HttpNotFound();
}
List<string> list = h.Hierarchy1.Split('/').ToList();
//Trial 1
var dat = from p in list where db.Hierarchies.Contains(p.list) select p; //
//Trial 2
var dat = db.Hierarchies.Where(s => s.People.Contains(list));//
return View("Result", dat);
}
基本上,首先在表层次结构中查找人,然后我得到一个用“/”分隔的父级列表(层次结构1)。从这个列表中,我试图过滤掉不在层次结构表列表中的每一行。该表每行包含更多信息(出生日期、年龄、眼睛颜色等)。所有名称都是唯一的,因此不会出现错误。
我已经成功地像每个蓝眼睛的人一样进行更轻松的搜索,但是当有多个搜索时,我似乎无法将其加起来。
我已经尝试将它作为一个数组,但我最近的阅读似乎说一个列表更好地存储我的 string.split。
Hierarchy1 字符串可能如下所示:
克里斯·约翰·威尔克斯/大卫·约翰·威尔克斯/克雷格·拉姆齐·威尔克斯/迈克尔·威尔克斯
层次表示例:
标题 - 层次结构 1;人;出生日期;年龄;眼睛;头发;
数据 - 上面的每个层次结构1;Michael Wilks;05/02/1980;37;蓝色;棕色
基本上我正在尝试获取一个列表,我可以根据上面的数据在下面的视图(foreach)上循环遍历:
- 克里斯·约翰·威尔克斯出生日期;年龄;眼睛;头发; (曾祖父)
- David John Wilks DOB;年龄;眼睛;头发; (祖父)
- Craig Ramsey Wilks DOB;年龄;眼睛;头发; (父亲)
- Michael Wilks DOB;年龄;眼睛;头发; (儿子)
等
在此处列出的试用 1 错误 ---> 包含(p.list)
在此处列出的试用 2 错误 ---> 包含(list)
所以我可能对什么是正确的格式有点不知所措,但我一直在搜索互联网,所以,这是我能拼凑起来的最好的一些。
感谢每个人和任何人的帮助和帮助。
更新 2017 年 9 月 18 日 我已经放弃了我的第一次尝试,我认为我找到了一个更好的关键字来搜索 = "LINQ" 这让我得到了一些更好的结果,我认为这些结果正确地指向了我的答案。
List<string> list = new List<string>();
list = h.Hierarchy1.Split('/').ToList();
foreach (string k in list)
{
IQueryable<Hierarchy> TQuery = from a in db.Hierarchies
where (a.People == k)
select a;
}
return View("Result", TQuery.ToList());
所以现在看起来我的查询有效,但我的“返回视图”在“TQuery”.ToList 上显示错误。 我的假设是因为我在 foreach 循环中而不是在外部调用它,所以我需要弄清楚如何在不引发错误的情况下将其取出。然后发布我将运行以查看它是否真的有效。
我仍然认为有一种方法可以在没有 foreach 循环的情况下做到这一点,但它让我无法理解
更新 19/09/2017 - 工作结果 所以我设法让它作为一个 IQueryable 工作并且没有一个 foreach - 我认为这意味着它是一个相当优化的解决方案 - 列表中的 People 在这一点上是无序的,但我认为这是次要的。
所以它是:
public ActionResult Result(string Person)
{
Hierarchy h = db.Hierarchies.First(i => i.People == Person);
if (h == null)
{
return HttpNotFound();
}
int lvl = h.Level;
var list = new string[lvl];
list = h.Hierarchy1.Split('/');
IQueryable<Hierarchy> TQuery = from a in db.Hierarchies
where list.Contains(a.People)
select a;
return View("Result", TQuery.ToList());
}
【问题讨论】:
-
包含方法需要一个字符串作为参数,为什么要传递列表(字符串列表)?您是否尝试过对列表进行 ForEach 循环?
-
@AryanFirouzyan - 是的,我从 foreach 循环开始,并没有取得太大的成功。我认为在搜索时我使用了错误的关键词。我似乎对“LINQ”有更多的运气,我认为这很重要。我将用我发现的内容更新我的帖子 - 仍然无法正常工作,但我认为我已经接近了
-
foreach 循环有问题。 TQuery 仅返回在列表的最后一项中找到的内容。在循环之前使用 null 启动 TQuery 并将结果添加到其中。为每个 k 添加 db.Hierarchies.Where(p=>p.Poeple == k) 到 TQuery。
-
@AryanFirouzyan - 感谢您与我一起解决一些问题。我认为就我最初的 SO 问题而言,这几乎是固定的。欣赏头脑风暴。
-
@AryanFirouzyan - 刚刚尝试了您的解决方案(我遗漏了一些东西)。它只显示列表中的最后一个人。所以很明显,当我通过循环时,它没有正确保存。您的解决方案看起来更好,因为它会订购我认为的列表。但我会继续我目前所做的工作,并在以后找出更精细的细节。谢谢
标签: c# arrays asp.net-mvc list controller