C# Linq:让语句作为常量?
我正在处理Linq查询表达式语句,希望使用let语句设置常量值作为查询的一部分,以减少潜在的错误 在我的例子中。。。(这是整体模型)。let语句“validateCount”是个问题C# Linq:让语句作为常量?,c#,.net,linq,entity-framework-6,expression-trees,C#,.net,Linq,Entity Framework 6,Expression Trees,我正在处理Linq查询表达式语句,希望使用let语句设置常量值作为查询的一部分,以减少潜在的错误 在我的例子中。。。(这是整体模型)。let语句“validateCount”是个问题 from referenceRow in context.SomeTable // We want 8 in the Take and the results to still be 8 after the where. // instead of typing in the value
from referenceRow in context.SomeTable
// We want 8 in the Take and the results to still be 8 after the where.
// instead of typing in the value twice (in this example), i wanted to use a constant value here
let validateCount = 8
// sub query expression in my example
let subQuery = from sub in context.SomeTable
where sub.SomeColumn == rowReference.SomeColumn
orderby sub.SomeColumn descending
select sub
// use the sub query, take X amount, apply filter, check to see if Count() is the same as Take()
where subQuery.Take(validateCount) // this is where we fail. if we put in the constant 8, we are ok.
.Where(x => x.SomeOtherColumn == "Some value")
.Count() == validateCount // this is fine
select referenceRow
不幸的是,在本例中,let表达式“validateCount”的单个值为8,它只能在.Count()的比较部分工作,但不能在不引发异常的情况下传递到.Take()中
限制必须是DbConstantExpression或DbParameterReferenceExpression。
参数名称:计数
正在寻找一种解决方案,在单个代码位置使用用户定义的常量,该常量可用于查询表达式的其余部分,包括.Take()和.Count(),而无需在代码中更新多个点
我们的应用程序允许用户提供自己的linq查询表达式来构建查询。我无法定义此查询范围之外的任何内容,必须使用类似于“let”语句的内容在范围内。
let
语句在查询表达式树中生成中间匿名类型投影(Select
call)。EF查询提供程序(如异常消息所示)要求将Skip
和Take
参数解析为常量或变量值(即能够在本地计算),因此let
不能用于此目的
相反,在Skip
/Take
表达式中使用的常量/变量应该在查询外部定义,并在内部使用
要定义常量值,请使用:
const int validateCount = 8;
var query = (from .... Take(validateCount) ...);
要定义变量值(SQL查询参数),请执行以下操作:
在这里,C#编译器将validateCount
转换为闭包,EF查询提供程序将乐于绑定一个参数(使用该值)
我们的应用程序允许用户提供自己的linq查询表达式来构建查询。我无法定义此查询范围之外的任何内容,必须使用类似于“let”语句的内容在范围内
在提供自己的查询时,用户应遵循与上述相同的
Skip
/Take
参数规则,即在查询之外定义自己的常量和变量。让
语句在查询表达式树中生成中间匿名类型投影(选择
调用)。EF查询提供程序(如异常消息所示)要求将Skip
和Take
参数解析为常量或变量值(即能够在本地计算),因此let
不能用于此目的
相反,在Skip
/Take
表达式中使用的常量/变量应该在查询外部定义,并在内部使用
要定义常量值,请使用:
const int validateCount = 8;
var query = (from .... Take(validateCount) ...);
要定义变量值(SQL查询参数),请执行以下操作:
在这里,C#编译器将validateCount
转换为闭包,EF查询提供程序将乐于绑定一个参数(使用该值)
我们的应用程序允许用户提供自己的linq查询表达式来构建查询。我无法定义此查询范围之外的任何内容,必须使用类似于“let”语句的内容在范围内
在提供自己的查询时,用户应遵循与上述相同的
跳过/获取
参数规则,即在查询之外定义自己的常量和变量。您确定这是c
let
来自f
。@CallbackKid let存在于C中,太抱歉了,很明显,它看起来像是你用let
作为var
语句,我现在看到它是linq
表达式的一部分来回答你的问题。为什么不直接使用表达式上方声明的局部变量呢?我可以在LINQ to SQL上运行它而不会出错-您使用的是哪个数据库提供程序?您确定这是c
let
来自f
。@CallbackKid let存在于C中,太抱歉了,很明显,它看起来像是你用let
作为var
语句,我现在看到它是linq
表达式的一部分来回答你的问题。为什么不使用表达式上方声明的局部变量?我可以在LINQ to SQL上运行此操作而不会出错-您使用的是什么数据库提供程序?您的意思是定义validateCount
和引用validationCount
?对不起,这是我的输入错误。当然,它应该是一个相同的常量/变量,它取代了let
范围变量。我知道我可以做到你在那里说的,但我也用斜体字指出,我不能声明语句之外的任何内容,因为我们的设计不允许(动态代码编译)在这里,只需要LINQ语法。我想看看是否有其他方法来声明“let”。但是,是的,如果我能在范围之外定义它们,我今天就不会在这里发布了。我想看看是否有人有其他想法/选项,我可以在其中定义内联。不过我很感谢你的帮助,不幸的是没有别的办法。EF特定要求(目前仅适用于这两种方法)。仍然不明白为什么用户(不是你)不能在他们的查询之外声明变量,因为LINQ允许,但是无论如何。祝你好运。你的意思是定义validateCount
和引用validationCount
?对不起,这是我的打字错误。当然,它应该是一个相同的常量/变量,它取代了let
范围变量。我知道我可以做到你在那里说的,但我也用斜体字指出,我不能声明语句之外的任何内容,因为我们的设计不允许(动态代码编译)在这里,只需要LINQ语法。我想看看是否有其他方法来声明“let”。但是,如果我能定义它们,我会的