2011-05-17 187 views
4

在我的實際問題的簡化版本中,我有兩個表格:UserMetadata。 每個用戶可以通過FKEY獲得與它們相關的各種數量的元數據條目。爲什麼Linq不能編譯?

這Linq的編譯罰款:

var user = from u in Context.Users 
      join m in Context.Metadata 
      on u.id equals m.userid 
      select new { u.id, m.value } 

但是,如果我取代 '的' 條款線路是:

on new { u.id } equals new { m.userid } 

它失敗,此錯誤編譯:

error CS1941: The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'. 

有誰知道爲什麼?

而獎勵積分:

我最終試圖完成這樣的查詢:

var user = from u in Context.Users 
      join m in Context.Metadata 
      on new { u.id, "mystring" } equals new { m.userid, m.key } 
      select new { u.id, m.value } 

的使用注意事項字面"mystring"的。不用說,這也行不通。

謝謝!

編輯: SLaks的答案的工作,但爲了什麼他在談論完全清楚,最終on條款的作品看起來像:

on new { id = u.id, key = "foo" } equals new { id = mu.userid, key = m.key } 
+0

爲什麼你需要比不上匿名對象的字段自己? – zerkms 2011-05-17 00:44:20

+0

@zrkms:加入兩個領域。 – SLaks 2011-05-17 00:45:25

+0

@SLaks:omg,不知道linq不能這麼說:-S – zerkms 2011-05-17 00:51:00

回答

9

在您的匿名類型必須匹配屬性名稱。

您可以指定這樣的名稱:new { UserId = u.id, Key = "mystring" }

+1

雖然我不明白你的意思,但它起作用(:在我的問題中添加了最終的工作語法。 – jwd 2011-05-17 00:53:22