gpt4 book ai didi

c# - 访问相关实体时如何获取 LINQ top(1)? .Take() 和 .FirstOrDefault() 不工作?

转载 作者:行者123 更新时间:2023-11-30 18:04:22 25 4
gpt4 key购买 nike

将 LINQ to Entities 与 Entity Framework 和 C# 结合使用:

我有一个名为 CanInactivateReason 的方法,它在允许用户停用原因之前检查是否没有事件的关联记录。如果该方法返回 false - 则会显示“DisabledDelete”图像和工具提示,告知用户为什么他们无法删除网格中的实体,而不是“删除”图像按钮。我的问题是查询返回所有相关对象而不是为每个导航属性执行 top 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)?

提前致谢!

最佳答案

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

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

类似(取决于您的模式):

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

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

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

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

关于c# - 访问相关实体时如何获取 LINQ top(1)? .Take() 和 .FirstOrDefault() 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6228892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com