簡體   English   中英

條件linq查詢行為

[英]conditional linq query behavior

我覺得標題有誤導性,請選擇編輯。 當我這樣做時:

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(....)處都有相同的字段)

編輯2:

我很抱歉..我的錯字。 各地的Select()都不一樣。 如果投影“匹配”,方法1也可以正常工作

如果您在LINQ查詢之后進行了強制轉換,一切都會好起來的。

你遇到的同樣的問題,然后做類似的事情

int? val = true ? 1 : null;

那是行不通的,但是如果您將null像這樣轉換:

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

是的

條件表達式需要它評估的兩個操作數為相同類型。 所以如果你這樣做

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

...“ A”和“ B”都是相同的類型(字符串),因此結果a將是string類型。

您的錯誤消息告訴您,您的兩個操作數( from ... Select語句的兩個)求值為匿名類型,但不是相同的匿名類型,並且無法將一種匿名類型轉換為另一種匿名類型。 因此,它不知道結果q應該是什么類型。

盡管我不確定100%,但我相信即使您的兩個表達式完全相同,它們也將是不同的匿名類型。 無論如何,您收到該錯誤的事實表明它們不是同一匿名類型。

使用第二組語句,首先將b設置為等於linq查詢的結果。 因此它具有一種類型。 盡管您的聲明確實如此,但是代碼編譯的事實意味着(use b here one way) (use b here differently) (use b here one way)(use b here differently) (use b here one way) (use b here differently)返回相同類型的結果。 例如,如果它們都返回與b類型相同的實例,則它們將具有相同的類型。

它認為錯誤消息解釋了這一點:

由於匿名類型之間沒有隱式轉換,因此無法確定條件表達式的類型。

這個

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

會編譯。 但是這個

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

會出現上述錯誤,因為{a=1}{b=2}不是相同的匿名類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM