为什么我的linq别名超出范围?

罗伯特

我试图更好地理解更复杂的linq语句。并感谢网上的几篇文章。我不明白的一件事是为什么我的查询别名在此语句中没有上下文:

(from query in _context.WebQueries
            select query).Where((from qry in _context.WebQueries
                join qg in _context.WebQueryGroups on qry.QueryKey equals qg.QueryKey
                where qg.QueryGroupNameKey == key
                                              //This is out of scope
                select qry.QueryKey).Contains(query.QueryKey));
                                    //if you replaced it with this same problem
                                    .Contains(qry.QueryKey));

我知道我可以使用匿名对象调用并获得所需的结果。我将只需要迭代对象并拉出我想要的列表:

(from query in _context.WebQueries
         select new {query, key = query.QueryKey})
         .Where(q => !(from qry in _context.WebQueries
                join qg in _context.WebQueryGroups on qry.QueryKey equals qg.QueryKey
                where qg.QueryGroupNameKey == key
                select qry.QueryKey).Contains(q.key));

这将返回一个对象,该对象带有我想要的列表以及稍后在查询中要引用的int。

为什么查询和qry都超出范围?我宁愿只在我的方法中返回linq语句,而不必解析一个对象以获取要返回的列表。一篇讨论这个问题的文章将是很棒的。

格特·阿诺德

尽管有一个可以解决根本问题并使查询正常运行的答案,但实际的问题尚未得到答案。为什么变量超出范围的问题的答案可能会帮助您更好地理解LINQ。

该声明...

from query in _context.WebQueries select query

可以改写为:

_context.WebQueries.Select(query => query)

(该部分.Select(query => query)是多余的,但为了解释起见,我将其留在此处)

可以使用方法主体将此语句重写为lambda表达式:

WebQueries.Select(query => { return query; })

(我将在后面解释为什么我不再使用_context.WebQueries了)

可以使用匿名方法将其重写为表达式:

WebQueries.Select(delegate(WebQuery query) { return query; })

可以使用命名方法将其重写为表达式:

WebQueries.Select(ReturnArg)

ReturnArg该方法在哪里

WebQuery ReturnArg(WebQuery query)
{
    return query;
}

这是相反的C#历史记录:我们过去只具有命名方法和委托。后来,为了实现LINQ和其他功能,引入了匿名方法和lambda表达式。但是这里要注意的是,对于编译器来说,方法语法仍然适用,因此lambda表达式query => query不过是带有名为的参数的方法而已query与所有方法一样,参数的作用域为方法主体

在LINQ术语中,此参数称为范围变量,因为它将用作对查询中每个连续元素的引用。

简而言之:range变量的作用域为定义该变量的LINQ语句。(from query in _context.WebQueries select query)是一条LINQ语句。后续Where是新的LINQ语句。

我停止使用的原因_context.WebQueries是EF不接受带有方法主体的lambda表达式。这是因为方法主体将方法的参数Where从表达式无声地转换为Func,而EF仅接受表达式。实际上,整个语句永远不会在CLR中执行,而是转换为SQL并由数据库引擎执行。但是,对于C#编译器,正确性规则仍然适用。范围变量是范围变量,无论其用途是什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的linq别名超出范围?

来自分类Dev

为什么我的for循环超出范围?

来自分类Dev

为什么我在C ++中超出范围,但在Perl中却超出范围?

来自分类Dev

为什么我的int []数组循环超出范围?

来自分类常见问题

为什么我的角色动画超出范围

来自分类Dev

为什么我的“向量下标超出范围”?

来自分类Dev

为什么我得到数组索引超出范围异常?

来自分类Dev

为什么我的角色动画超出范围

来自分类Dev

为什么我的索引超出范围异常

来自分类Dev

为什么我的代码索引超出范围?

来自分类Dev

为什么我的列表索引超出范围?

来自分类Dev

为什么我收到异常ArgumentOutOfRangeException:参数超出范围。

来自分类Dev

为什么我的字符串索引超出范围?

来自分类Dev

为什么我的向量下标超出范围?

来自分类Dev

为什么CastleWindsor的BeginScope超出范围?

来自分类Dev

为什么索引超出范围异常?

来自分类Dev

为什么矢量下标超出范围?

来自分类Dev

为什么索引超出范围?

来自分类Dev

为什么此变量超出范围?

来自分类Dev

为什么索引超出范围?

来自分类Dev

为什么struct变量超出范围

来自分类Dev

为什么索引超出范围?(Python)

来自分类Dev

为什么会超出范围?

来自分类Dev

substringWithRange超出范围-我缺少什么?

来自分类Dev

substringWithRange超出范围-我缺少什么?

来自分类Dev

下标超出范围,我缺少什么?

来自分类Dev

为什么我收到索引超出范围错误消息,即使它在范围内?

来自分类Dev

为什么我的组件超出范围,请帮助我将其与必要的代码对齐

来自分类Dev

谁能告诉我为什么我得到IndexError:列表索引超出范围?

Related 相关文章

热门标签

归档