Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq:让语句作为常量?_C#_.net_Linq_Entity Framework 6_Expression Trees - Fatal编程技术网

C# Linq:让语句作为常量?

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

我正在处理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 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”。但是,如果我能定义它们,我会的