查询仅包含非受保护资源

时间:2013-02-26 03:13:30

标签: c# asp.net linq entity-framework linq-to-entities

我正在使用Entity Framework从我的数据库中检索数据。您可以在此处查看数据库模型:

edmx

我正在尝试构建一个转发器,只有在有资源where IsProtected == false时才会显示资源类别。然后是一个嵌套的转发器,显示资源本身。

这是一个缩写中继器,以帮助澄清我正在寻找的内容

<asp:Repeater>
    <h2>Category Name</h2>
    <ol>
        <asp:Repeater DataSource="<%# ((ResourceCategory)Container.DataItem).Resource %>">
            <li>Resource Name</li>
        </asp:Repeater>
    </ol>
</asp:Repeater>

我目前使用的查询确实提取了Resource.Count() > 0的任何类别,但不知道如何编写我的where语句,因为它实际上与Resource相关表:

public List<Model.ResourceCategory> GetResourcesWithDocuments()
{
    using (var context = new SafetyInSightEntities())
    {
        return (from cat in context.ResourceCategory.Include("Resource")
                orderby cat.Name
                where cat.Resource.Count > 0
                select cat).ToList();
    }
}

有人可以帮我改写我的LINQ查询,这样我的内部转发器只显示资源IsProtected == false

2 个答案:

答案 0 :(得分:2)

我不确定你在问什么,但我想你想要这个?

public List<Model.ResourceCategory> GetResourcesWithDocuments()
{
    using (var context = new SafetyInSightEntities())
    {
        return (from cat in context.ResourceCategory
                orderby cat.Name
                where cat.Resource.Any()
                select new 
                {
                    CategoryName = cat.Name,
                    Resources = cat.Resource.Where(r => r.IsProtected == false).ToList()
                }).ToList();
    }
}

您可能希望使用All而不是Any,但根据问题不确定。

答案 1 :(得分:1)

试试这个:

public IEnumerable<ResourceCategoryFacade> GetResourcesWithDocuments() // return weaker interface
{
    using (var context = new SafetyInSightEntities())
    {
        var q = from cat in context.ResourceCategory.Include(cat => cat.Resource)
                orderby cat.Name
                select new ResourceCategoryFacade // anonymous, or compiler-time type
                {
                    CategoryName = cat.Name,
                    Resources = cat.Resource.Where(r => !r.IsProtected).ToList() // or ToArray()
                };
        return q.ToList(); // or ToArray()
    }
}