将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)?
提前致谢!
答案 0 :(得分:1)
通过这样的导航属性工作可能会导致问题。取决于您如何配置LazyLoading,底层模型是什么(例如使用继承关联)以及reasonToInactivate的基本查询是什么。
作为一个起点,我建议回到查询的基础 - 只是为了证明这个概念。
所以(取决于你的架构):
if(context.SuggestionReasonsEntitySet.Any(p => p.ReasonId == reasonToActivateId && p.IsActive))
{
canInactivate = false; // Still active enhancements associated
}
完全支持导航属性。导航属性可能很棒,但它们也可以模糊应该是非常简单的查询。我个人坚持选择查询(即避免在创建投影时必须进行连接),但要避免过滤逻辑 - 只是因为在使用继承关联时我被咬了几次这样的事情。
如果有效,那么您可以尝试回到导航属性解决方案,找到出错的地方。
如果这没有帮助 - 上面的查询生成的SQL是否足够短以便发布(并被理解)?如果是这样你可以发布吗?