访问相关实体时如何获得LINQ top(1)? .Take()和.FirstOrDefault()不起作用?

时间:2011-06-03 15:09:02

标签: c# linq entity-framework linq-to-entities entity

将LINQ实体与实体框架和C#一起使用:

我有一个名为CanInactivateReason的方法,它在允许用户取消激活原因之前检查没有活动的关联记录。如果方法返回false,则显示“DisabledDelete”图像,其中显示工具提示,告知用户他们为什么无法删除网格中的实体而不是“删除”图像按钮。我的问题是性能,其中查询返回所有相关对象,而不是为每个导航属性执行前1。

.Take(1)扩展方法没有将top(1)添加到我的LINQ to Entities查询 - 为什么??

也不是.Count()> 0或.Any()或.Take(1)。ToArray()。Any()或.FirstOrDefault()!= null

这是我的方法返回bool所以我宁愿查询排在前1 - 我尝试了下面的每个项目:

    public bool CanInactivateReason(Reason reasonToInactivate)
    {
        bool canInactivate = true;

        if (reasonToInactivate.ProductReasons.Select(pa => pa).Where(pa => pa.Inactive == false).Count() > 0)
        {
            canInactivate = false; // Still active products associated
        }

        if (reasonToInactivate.EnhancementReasons.Select(ea => ea).Where(ea => ea.Inactive == false).Any())
        {
            canInactivate = false; // Still active enhancements associated
        }

        if (reasonToInactivate.SuggestionReasons.Select(sa => sa).Where(sa => sa.Inactive == false).Take(1).ToArray().Any())
        {
            canInactivate = false; // still active suggestions associated
        }

        if ((reasonToInactivate.SessionProductReasons.Select(spr => spr).Where(spr => spr.Inactive == false).FirstOrDefault()) != null)
        {
            canInactivate = false; // Still active sessions associated
        }
        return canInactivate;
    }

我假设这是由于访问我的对象的相关实体,但是我该怎么做才能将这些查询转换为SQL生成的top(1)?

提前致谢!

1 个答案:

答案 0 :(得分:1)

通过这样的导航属性工作可能会导致问题。取决于您如何配置LazyLoading,底层模型是什么(例如使用继承关联)以及reasonToInactivate的基本查询是什么。

作为一个起点,我建议回到查询的基础 - 只是为了证明这个概念。

所以(取决于你的架构):

if(context.SuggestionReasonsEntitySet.Any(p => p.ReasonId == reasonToActivateId && p.IsActive)) 
{
    canInactivate = false; // Still active enhancements associated
}

完全支持导航属性。导航属性可能很棒,但它们也可以模糊应该是非常简单的查询。我个人坚持选择查询(即避免在创建投影时必须进行连接),但要避免过滤逻辑 - 只是因为在使用继承关联时我被咬了几次这样的事情。

如果有效,那么您可以尝试回到导航属性解决方案,找到出错的地方。

如果这没有帮助 - 上面的查询生成的SQL是否足够短以便发布(并被理解)?如果是这样你可以发布吗?