首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ IQueryable

LINQ IQueryable
EN

Stack Overflow用户
提问于 2009-06-24 10:13:19
回答 4查看 725关注 0票数 1

我有一个Menu类,它有一个名为WebPages的IQueryable属性。在下面的语句中,我基于匹配返回菜单项,但我需要包括Webpages属性。这是我目前所拥有的。

代码语言:javascript
复制
var allCategories = Menu.All().Where(x => x.CategoryID == 4 && x.Visible)

我需要扩展它来检查WebPage类中的属性,如下所示。

代码语言:javascript
复制
var allCategories = Menu.All().Where(x => x.CategoryID == 4 && x.Visible && x.WebPages.Roles.Contains(User.Identity.Name))

这不会编译,但我希望您能理解我正在尝试做的事情。

注意:网页属性是由PageID填充的,而不是CategoryID,但不确定这是否有区别??

以下是我的课程的简要概述。

代码语言:javascript
复制
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;}
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-24 10:31:25

这对你来说应该够了,伙计。你只需要说WebPages.Any,如果任何菜单包含你指定角色的网页,这将返回true。

代码语言:javascript
复制
var allCategories = menus.Where(menu => menu.CategoryID == 1 && menu.Visible && menu.WebPages.Any(webPage => webPage.Roles.Contains(roleToSearchFor)));

所以你需要添加的关键点是这样的。

代码语言:javascript
复制
menu.WebPages.Any(webPage => webPage.Roles.Contains(roleToSearchFor))

使用Any()函数非常有效,因为一旦找到匹配,它就会停止查找。

如果您使用Where(),然后使用 count (),它将遍历所有网页以查找所有匹配,然后遍历结果以对它们进行计数,因此效率会低得多。

下面是一个完整的源代码示例,供您尝试。

代码语言:javascript
复制
    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;
            }
        }
票数 0
EN

Stack Overflow用户

发布于 2009-06-26 07:16:25

如果我没理解错的话,你想要这样的东西:

代码语言:javascript
复制
var menuItems =
    from menuItem in Menu.All()
        where menuItem.Visible
            and (
                menuItem.WebPages.Contains(
                    webPage => webPage.Roles.Contains(
                        "role"
                    )
                )
                or menuItem.PageIsNull
            )
        select menuItem;

这应该只选择连接到具有适当角色的页面的菜单项。

票数 1
EN

Stack Overflow用户

发布于 2009-06-24 10:24:50

尝试更改

代码语言:javascript
复制
public IQueryable<WebPage> WebPages

代码语言:javascript
复制
public IEnumerable<WebPage> WebPages

我认为LINQ查询返回IEnumerable...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1037499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档