【问题标题】:LINQ to SQL EfficiencyLINQ to SQL 效率
【发布时间】:2014-02-10 18:10:50
【问题描述】:

我是 LINQ 的新手,我有一个关于“点击数据库一次”类型的事务的问题。

在下面的代码中,我将查询结果数据绑定到单选列表。我想运行一次查询,然后在数据绑定之前处理结果。 IE:如果有值,数据绑定到 Radio 列表,否则显示一个文本框说明没有值。

从我的在线搜索中,我发现我可以使用 .count() 运行一次查询,然后如果 .count() > 0 则再次运行。

我宁愿访问数据库一次,然后计算记录数,然后继续使用相同的结果集。

我不确定搜索时要使用的术语,所以请使用合适的术语进行回复,以便我自己找到答案!

using (RTOExceptionDataContext thisDataContext = new RTOExceptionDataContext())
{
    rdoSelectTransition.DataSource =    from tracking in thisDataContext.vw_RTOExceptionWorkflowTransitionMaps
                                                where tracking.RTOExceptionId.Equals(Convert.ToInt32(Request.QueryString["RTOExceptionId"])) &&
                                                tracking.RTOSecurityLevel.Equals((int)Master.thisUserSecurityLevel)
                                                select new { tracking.RTOTransitionCd, tracking.TransitionDisp };
    rdoSelectTransition.DataTextField = "TransitionDisp";
    rdoSelectTransition.DataValueField = "RTOTransitionCd";
    rdoSelectTransition.DataBind();
}

【问题讨论】:

  • 使用 .ToList() 并将结果存储在列表中。然后您可以计算列表并使用列表值。您希望结果中有多少项?

标签: c# asp.net linq-to-sql


【解决方案1】:

您根本不需要这样做。只需保持绑定代码不变,并在GridView 的标记中使用<EmptyDataTemplate> 来指示在将空集合绑定到GridView 时应显示的内容。

如果您要将数据绑定到不支持此类功能的控件类型,那么最简单的选择是简单地将查询物化为集合,然后获取该内存中集合的大小。

var data = (from tracking in thisDataContext.vw_RTOExceptionWorkflowTransitionMaps
    where tracking.RTOExceptionId.Equals(Convert.ToInt32(Request.QueryString["RTOExceptionId"])) &&
        tracking.RTOSecurityLevel.Equals((int)Master.thisUserSecurityLevel)
    select new { tracking.RTOTransitionCd, tracking.TransitionDisp })
    .ToList();

if(data.Any())
    //databind
else
   //do something else

【讨论】:

  • 我没有在 gridview 中显示数据,它是一个单选按钮列表,它(根据快速的谷歌搜索,没有什么详尽的)没有 选项。非常感谢您的回复。
【解决方案2】:

我确实找到了我的问题的答案!我每天都在学习更多关于 LINQ 的知识,我真的很喜欢它!如果有结果,这允许我进行数据绑定。虽然下面没有显示“else”,但它将单选按钮的可见性设置为 false。

        int thisUserSecurityLevel = (int)Master.thisUserSecurityLevel;
        int thisUserSelectedException = Convert.ToInt32(Request.QueryString["RTOExceptionId"]);

        using (RTOExceptionDataContext thisDataContext = new RTOExceptionDataContext())
        {
            var query = from tracking in thisDataContext.vw_RTOExceptionWorkflowTransitionMaps
                        where tracking.RTOExceptionId.Equals(thisUserSelectedException) &&
                        tracking.RTOSecurityLevel.Equals(thisUserSecurityLevel)
                        select new { tracking.RTOTransitionCd, tracking.TransitionDisp };

            if (query.Count() > 0)
            {

                rdoSelectTransition.DataSource = query;
                rdoSelectTransition.DataTextField = "TransitionDisp";
                rdoSelectTransition.DataValueField = "RTOTransitionCd";
                rdoSelectTransition.DataBind();

            }                
        }
    }

【讨论】:

  • 这将按照问题中的要求执行两次,而不是一次。
  • 我太兴奋了!我试图使用@Guanxi 建议的.CopyToDataTable() 和.ToList(),但我无法执行到数据表的转换。回到绘图板!
  • 顺便说一句,您应该使用query.Any() 而不是query.Count(),因为Count() 方法必须完全迭代所有结果,而Any 可以在找到单个结果的瞬间停止迭代.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2013-04-12
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多