2014-12-06 56 views
1

我寫了一個擴展方法:擴展方法對於IQueryable的工作不

public static IQueryable<TSource> ConditionalDefaultEmpty<TSource>(this IQueryable<TSource> source, bool condition) 
{ 
    return condition ? source.DefaultIfEmpty() : source ; 
} 

然後我調用的方法,像這樣:

var q = from sr in myDb.tblStudentsRegInfos 
     from de in myDb.tblDisciplinesEvents.Where(e => sr.Serial == e.tblStudentsRegInfoRef 
                && e.tblStudentsRegInfoRef == studentRegId 
                && (!forStudent || e.PublishOnInternet) 
                && (!formDate.HasValue || e.RegDate >= formDate) 
                && (!toDate.HasValue || e.RegDate <= toDate)) 
        .ConditionalDefaultEmpty(noPrintAll) 
     join dt in myDb.tblDisciplinesTitles on de.tblDisciplinesTitlesRef equals dt.Serial 
     where sr.Serial == studentRegId 
     group sr by new 
       { 
... 
       } 
       into std 
       select new 
       {.... 
       }; 

但我得到這個錯誤:

會員訪問[專欄名稱]不合法....

我該如何解決這個問題?

更新:我明白,EF無法編譯到的IQueryable ...

+0

請問,當你不使用你的方法查詢工作? – Euphoric 2014-12-06 13:03:22

+0

是的,它的工作非常好。 – 2014-12-06 13:03:50

+0

你可以執行第二個(你的方法的部分)作爲單獨的查詢嗎? – Euphoric 2014-12-06 13:04:32

回答

-1

你就不能添加自定義擴展方法,並希望實體框架將能夠把它翻譯成SQL,儘管這會非常酷,至少對於這樣的情況。

這就是說,你可以把IQueryableIEnumerable

.AsEnumerable() 
.ConditionalDefaultEmpty(noPrintAll) 
+0

我不明白downvote,因爲這正是原因。也許是因爲子查詢中的AsEnumerable()不會有幫助,因爲EF不能將查詢的第一部分翻譯成SQL,而是在內存中執行其餘部分。 – 2014-12-06 19:06:39

相關問題