2017-05-05 27 views
2

這應該是一個簡單的聯合查詢,但即使動作類型是相同的它扔我一個錯誤:EF聯盟問題「不能轉換<AnonymusType#1至AnonymusType#2>

Instance argument: cannot convert from System.Linq.IQueryable<AnonymousType#1> to System.Linq.ParallelQuery<AnonymousType#2>

如果我刪除此列則是工作的罰款。在第一選擇我要行動賦值爲「0」。任何幫助表示讚賞。謝謝

(from p in Pages join pa in PageAct on p.PageId equals pa.PageId 
select new 
{ 
    PageId = p.PageId, 
    PgName = p.PgName, 
    ActionId = pa.ActionId, 
    ActionName = pa.ActionName, 
    **action = 0** 
}).Union(from p in Pages 
join pa in PageAct on p.PageId equals pa.PageId 
join rp in RolePerm on pa.ActionId equals rp.ActionId into jrs 
from jrResult in jrs.DefaultIfEmpty() 
where jrResult.RoleId == 1 
select new 
{ 
    PageId = p.PageId, 
    PgName = p.PgName, 
    ActionId = pa.ActionId, 
    ActionName = pa.ActionName, 
    action = jrResult.ActionId 
}) 
+0

請出示你在那裏實際使用的查詢的執行它 –

+3

jrResult.ActionId可以爲空,所以要做到這一點的唯一方法是投給一個可空INT在第一匿名對象'動作=(INT? )0',如果jrResult.ActionId是一個非空類型,那麼我建議在這裏做同樣的事情'action =(int?)jrResult.ActionId' – Silvermind

+0

我正在使用LinqPad –

回答

1

匿名對象應該具有完全相同的簽名被認爲是相同的。

如果RolePerm.ActionId是可爲空的類型,則第一個匿名對象屬性類型也應爲空。 實際類型也可以是非空的,但由於這是一個左連接,因此您不應該忘記顯式拋出一個可爲null的int,否則可能會遇到運行時異常。

(from p in Pages join pa in PageAct on p.PageId equals pa.PageId 
select new 
{ 
    PageId = p.PageId, 
    PgName = p.PgName, 
    ActionId = pa.ActionId, 
    ActionName = pa.ActionName, 
    action = (int?)0 
}).Union(from p in Pages 
join pa in PageAct on p.PageId equals pa.PageId 
join rp in RolePerm on pa.ActionId equals rp.ActionId into jrs 
from jrResult in jrs.DefaultIfEmpty() 
where jrResult.RoleId == 1 
select new 
{ 
    PageId = p.PageId, 
    PgName = p.PgName, 
    ActionId = pa.ActionId, 
    ActionName = pa.ActionName, 
    action = (int?)jrResult.ActionId // should cast, even if ActionId is not nullable 
             // because left join might give null 
})