条件linq查询行为

本文关键字:查询 linq 条件 | 更新日期: 2023-09-27 18:06:28

我感觉标题是误导,请编辑如果你选择。当我这样做的时候:

var q  = (condition)?(from ...Select(..)): (from.. Select(..));

我得到一个错误在":"说

Type of conditional expression could not be determined because 
there is no implicit conversion between anonymous types. 

但是如果我这样做了:

var b = some base linq query;
var q = (condition)?(use b here one way):(use b here differently);

没有投诉。为什么?第二种方式有什么不同?

编辑:

无论在哪里,我最终的预测都是一样的。(最后.Select(....)所有地方都有相同的字段)

Edit2:

我道歉. .是我打错字了。各处的Select()都不一样。如果投影'匹配'

条件linq查询行为

,方法1也可以正常工作

它认为错误信息解释了这一点:

无法确定条件表达式的类型,因为匿名类型之间没有隐式转换。

var x = 0 < 2 ? new { a = 1 } : new { a = 2 }

将编译。但这

var x = 0 < 2 ? new { a = 1 } : new { b = 2 };

将给出上述错误,因为{a=1}{b=2}不是相同的匿名类型。

如果在LINQ查询之后进行强制转换,一切都会好起来的。

这和你写

时遇到的问题差不多
int? val = true ? 1 : null;

这是不行的,但是如果你像这样强制转换null:

int? val = true ? 1 : (int?)null;

条件表达式需要计算的两个操作数类型相同。所以如果你做

var a = (condition)? "A" : "B";

…"A"answers"B"都是同一类型(字符串),因此结果a将是string类型。

你的错误消息告诉你的是你的两个操作数(两个from ... Select语句)的值是匿名类型,但不是同一个匿名类型,并且它不能将一个匿名类型转换为另一个匿名类型。因此,它不知道结果q应该是什么类型。

虽然我不能100%确定,但我相信即使你的两个表达式完全相同,它们也会是不同的匿名类型。无论如何,您得到这个错误的事实表明它们不是相同的匿名类型。

对于第二组语句,首先将b设置为等于linq查询的结果。因此它有一个类型。虽然您的声明确实这么说,但代码编译的事实意味着(use b here one way)(use b here differently)返回相同类型的结果。例如,如果它们都返回与b相同类型的实例,则它们将具有相同的类型。