条件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()都不一样。如果投影'匹配'
它认为错误信息解释了这一点:
无法确定条件表达式的类型,因为匿名类型之间没有隐式转换。
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
相同类型的实例,则它们将具有相同的类型。