我有一个Menu类,它有一个名为WebPages的IQueryable属性。在下面的语句中,我基于匹配返回菜单项,但我需要包括Webpages属性。这是我目前所拥有的。
var allCategories = Menu.All().Where(x => x.CategoryID == 4 && x.Visible)我需要扩展它来检查WebPage类中的属性,如下所示。
var allCategories = Menu.All().Where(x => x.CategoryID == 4 && x.Visible && x.WebPages.Roles.Contains(User.Identity.Name))这不会编译,但我希望您能理解我正在尝试做的事情。
注意:网页属性是由PageID填充的,而不是CategoryID,但不确定这是否有区别??
以下是我的课程的简要概述。
public partial class Menu: IActiveRecord
{
public int ID {get; set;}
public int CategoryID {get;set;}
public bool Visible {get;set;}
public int PageID {get;set;}
public IQueryable<WebPage> WebPages
{
get
{
var repo=NorthCadburyWebsite.Models.WebPage.GetRepo();
return from items in repo.GetAll()
where items.ID == _PageID
select items;
}
}
}
public partial class WebPage: IActiveRecord
{
public int ID {get;set;}
public string Roles {get;set;}
}发布于 2009-06-24 10:31:25
这对你来说应该够了,伙计。你只需要说WebPages.Any,如果任何菜单包含你指定角色的网页,这将返回true。
var allCategories = menus.Where(menu => menu.CategoryID == 1 && menu.Visible && menu.WebPages.Any(webPage => webPage.Roles.Contains(roleToSearchFor)));所以你需要添加的关键点是这样的。
menu.WebPages.Any(webPage => webPage.Roles.Contains(roleToSearchFor))使用Any()函数非常有效,因为一旦找到匹配,它就会停止查找。
如果您使用Where(),然后使用 count (),它将遍历所有网页以查找所有匹配,然后遍历结果以对它们进行计数,因此效率会低得多。
下面是一个完整的源代码示例,供您尝试。
namespace DoctaJonez.TestingBrace
{
public partial class Menu //: IActiveRecord
{
public int ID { get; set; }
public int CategoryID { get; set; }
public bool Visible { get; set; }
public int PageID { get; set; }
public IQueryable<WebPage> WebPages { get; set; }
}
public partial class WebPage //: IActiveRecord
{ public int ID { get; set; } public string Roles { get; set; } }
public static class Launcher
{
/// <summary>
/// The Main entry point of the program.
/// </summary>
static void Main(string[] args)
{
Menu myMenu1 = new Menu
{
ID = 1,
CategoryID = 1,
PageID = 1,
Visible = true,
WebPages = new List<WebPage>()
{
new WebPage { ID = 1, Roles = "Role1" },
new WebPage { ID = 1, Roles = "Role2" },
new WebPage { ID = 1, Roles = "Role3" },
}.AsQueryable()
};
Menu myMenu2 = new Menu
{
ID = 1,
CategoryID = 1,
PageID = 1,
Visible = true,
WebPages = new List<WebPage>()
{
new WebPage { ID = 1, Roles = "Role3" },
new WebPage { ID = 1, Roles = "Role4" },
new WebPage { ID = 1, Roles = "Role5" },
}.AsQueryable()
};
Menu myMenu3 = new Menu
{
ID = 1,
CategoryID = 1,
PageID = 1,
Visible = true,
WebPages = new List<WebPage>()
{
new WebPage { ID = 1, Roles = "Role5" },
new WebPage { ID = 1, Roles = "Role6" },
new WebPage { ID = 1, Roles = "Role7" },
}.AsQueryable()
};
List<Menu> menus = new List<Menu>() { myMenu1, myMenu2, myMenu3 };
string roleToSearchFor = "Role3";
var allCategories = menus.Where(menu => menu.CategoryID == 1 && menu.Visible && menu.WebPages.Any(webPage => webPage.Roles.Contains(roleToSearchFor))).ToList();
return;
}
}发布于 2009-06-26 07:16:25
如果我没理解错的话,你想要这样的东西:
var menuItems =
from menuItem in Menu.All()
where menuItem.Visible
and (
menuItem.WebPages.Contains(
webPage => webPage.Roles.Contains(
"role"
)
)
or menuItem.PageIsNull
)
select menuItem;这应该只选择连接到具有适当角色的页面的菜单项。
发布于 2009-06-24 10:24:50
尝试更改
public IQueryable<WebPage> WebPages至
public IEnumerable<WebPage> WebPages我认为LINQ查询返回IEnumerable...
https://stackoverflow.com/questions/1037499
复制相似问题