条件linq查询行为

时间:2013-03-28 21:12:33

标签: c# linq linq-to-sql

我觉得标题有误导性,如果您愿意,请编辑。当我这样做时:

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);
没有抱怨。为什么?第二种方式有何不同?

编辑:

到处都是,我的最终预测是一样的。 (最后。选择(....)到处都有相同的字段)

Edit2:

我道歉...我的错字。 Select()s到处都不一样。如果投影“匹配”

,方法1也可以正常工作

3 个答案:

答案 0 :(得分:2)

如果你在LINQ查询后进行了演员表,一切都会好的。

你遇到的问题与

类似
int? val = true ? 1 : null;

这不起作用,但是如果你像这样抛出null:

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

确实如此。

答案 1 :(得分:2)

条件表达式需要它评估的两个操作数是相同的类型。所以,如果你这样做

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

......两个" A"和" B"属性相同(字符串),因此结果a的类型为string

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

虽然我不是百分百肯定,但我相信即使你的两个表达方式完全相同,它们也会是不同的匿名类型。无论如何,您收到该错误的事实表明它们不是同一个匿名类型。

使用第二组语句,首先将b设置为等于linq查询的结果。因此它有一种类型。尽管您的陈述确实如此,但代码编译意味着(use b here one way)(use b here differently)返回相同类型的结果。例如,如果它们都返回与b相同类型的实例,则它们将具有相同的类型。

答案 2 :(得分:2)

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

  

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

这个

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

会编译。但是这个

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

会出现上述错误,因为{a=1}{b=2}的匿名类型不同。