您好我正在使用linq,api,ef开发一个应用程序。我坚持一点,我有一些棘手的要求。我必须遍历表格。下面是我的数据库表。
ID PID PrID LID Visibility
80 50 0 1 VISIBLE
81 50 0 1 HIDDEN
82 50 81 2 HIDDEN
84 50 82 3 HIDDEN
85 50 82 3 VISIBLE
89 50 82 3 VISIBLE
92 50 82 3 VISIBLE
93 50 81 2 VISIBLE
118 50 82 3 VISIBLE
125 50 82 3 VISIBLE
2237 50 82 3 VISIBLE
2238 50 82 3 VISIBLE
2241 50 80 2 VISIBLE
2242 50 80 2 HIDDEN
2243 50 2241 3 VISIBLE
2244 50 2241 3 HIDDEN
2245 50 2242 3 VISIBLE
在上表中,当PrID为0时意味着它不会有任何父母。当前行本身是父级。 每当我通过上表的每一行进行评估时。我想查看天气,其父母的可见性是可见的或隐藏的。 例如, 当我遍历第3行时,PrID是81.再次81的PrID是0所以隐藏 当我遍历第4行时,PrID是82.再次82的PID是81,而81的父亲是0是隐藏的等等。
当我遍历第5行时,PrID为82。再次82的PID是81,而81的父亲是0是隐藏的等等。
当我迭代第8行时,PrID是81.再次81的PrID是0所以隐藏
最后,我应该有一个只有可见行的列表。
public HttpResponseMessage Get(int projectsId)
{
List<NCT_Process> abc = new List<NCT_Process>();
abc = (from c in entityObject.NCT_Process where c.projectId == projectsId select c).ToList();
var visibles = abc.Where(x => IsVisible(x)).ToList();
//other code
}
public static bool IsVisible(NCT_Process tableItem)
{
if (tableItem.parentId == 0)
return tableItem.visibility;
else
{
var parent = table.FirstOrDefault(x => x.ID == tableItem.parentId);
return IsVisible(parent);
}
}
我可以去一级检查PrID是否可见。例如,在第5行PrID是82.再次82的PID是81,而81的父亲是0。 我们需要检查3个级别。我可以得到一些帮助来获得逻辑吗?我想努力获得逻辑。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:1)
这个怎么样
public testTable getParent(testTable item){
var parent=item;
while(true){
if(parent.PrID ==0)
break;
parent=dbo.testTables.SingleOrDefault(i => i.Id==parent.PrID)
}
return parent;
}
yourList.ToList().Select(item =>new{
isParentVisible=getParent(item).Visibility
})
答案 1 :(得分:1)
递归函数可能适用于这种情况..
public static bool IsVisible(TableItem tableItem)
{
if (tableItem.PrID == 0)
return tableItem.Visibility;
else
{
var parent = table.FirstOrDefault(x => x.ID == tableItem.PrID);
return IsVisible(parent);
}
}
static List<TableItem> table = new List<TableItem>();
var visibles = table.Where(x => IsVisible(x)).ToList();
更新将第二个参数表作为Enumarable
public static string IsVisible(TableItem tableItem, IEnumerable<TableItem> table)
{
if (tableItem.PrID == 0 || tableItem.Visibility.Equals("HIDDEN"))
return tableItem.Visibility;
else
{
var parent = table.FirstOrDefault(x => x.ID == tableItem.PrID);
return IsVisible(parent, table);
}
}
var visibles = table.Where(x => IsVisible(x,
table.AsEnumerable()).Equals("VISIBLE")).ToList();