2011-05-02 66 views
0

我嘗試將查詢1重新分解爲查詢2語法...因爲更具可讀性等 像「group,begindate,enddate和excludeManifestatie」這樣的參數是通過參數傳遞的(方法PARMS)..我檢查他們是否爲空白或不)通過與否,所以我可以建立我的LINQ的動態SQL。Linq方法語法 - 無法將IQueryable轉換爲Bool

但我得到的錯誤在查詢1,當我使用....的HasValue檢查。它說: 「無法隱式轉換類型‘System.Linq.IQueryable’到‘布爾’」

查詢2正常工作,這就是我想要的東西,但它複雜的語法,所以我需要ŧ o糾正查詢1語法。

查詢1:

((String.IsNullOrEmpty(group)) ? (a.id != -1) : (a.no_group == group)) 
&& ((group.Equals("990") || (group == string.Empty)) ? (!a.displaylocal.HasValue || a.displaylocal.Value == false) : (a.id != -1)) 
&& ((a.begindate.HasValue ? DateTime.Now >= a.begindate.Value : a.id != -1) && 
    (a.enddate.HasValue ? DateTime.Now <= a.enddate.Value : a.id != -1)) 
&& ((String.IsNullOrEmpty(excludeManifestatie)) ? (a.id != -1) : (a.type_manifestation != excludeManifestatie)) 

新/更好的方式來寫:

QUERY 2:

var query = dc.agenda.AsQueryable(); 
if (!string.IsNullOrEmpty(group)) 
    query = query.Where(a => a.no_group == group); 
if (group.Equals("990") || group.Equals(string.Empty)) 
    if ((query.Where(a => a.displaylocal.HasValue))) //Gives ERROR 
     query = query.Where(a => a.displaylocal >= DateTime.Now); 
if (!string.IsNullOrEmpty(excludeManifestatie)) 
    query = query.Where(a => a.type_manifestation != excludeManifestatie); 
if (query.Where(a => a.begindate.HasValue)) //Gives ERROR 
    query = query.Where(a => a.begindate <= DateTime.Now); 
if ((query.Where(a => a.enddate.HasValue))) //Gives ERROR 
    query = query.Where(a => a.enddate >= DateTime.Now); 
+2

@Answerers:** **請停止發佈廢話改變if(where)'部分,就像'if(any/count/singleordefault)',因爲這完全是另一回事。請閱讀他的問題,特別是他的原始查詢! – 2011-05-02 12:54:46

+0

@丹尼爾你是對的,我們肯定錯過了這個問題的一些東西,但那東西可能在右上角:) – 2011-05-02 13:11:23

回答

4

你不能像這樣做。如果你想在每一行中包含一個基於數據的條件,你需要按照你的方式。我在最後一個問題中給出的方法只適用於應該根據外部參數添加條件的情況。我會用這個條件:

query = query.Where(a => (a.begindate.HasValue && a.begindate <= DateTime.Now) || 
         !a.begindate.HasValue); 

你完整的代碼如下所示:

var query = dc.agenda.AsQueryable(); 
if (!string.IsNullOrEmpty(group)) 
    query = query.Where(a => a.no_group == group); 
if (group.Equals("990") || group.Equals(string.Empty)) 
    query = query.Where(a => (a.displaylocal.HasValue && a.displaylocal >= DateTime.Now) || 
     !a.displaylocal.HasValue); 
if (!string.IsNullOrEmpty(excludeManifestatie)) 
    query = query.Where(a => a.type_manifestation != excludeManifestatie); 
query = query.Where(a => (a.begindate.HasValue && a.begindate <= DateTime.Now) || 
         !a.begindate.HasValue); 
query = query.Where(a => (a.enddate.HasValue && a.enddate >= DateTime.Now) || 
         !a.enddate.HasValue); 
+0

我同意這個解決方案和你的意見。所有其他從我得到-1。 – Euphoric 2011-05-02 13:24:02

+0

它像機器一樣工作,所以非常感謝。我比較了兩個查詢並給出了兩條記錄。你能解釋一下爲什麼加入||嗎? !a.begindate.HasValue)和|| !a.enddate.HasValue); statemetns。我的意思是當我刪除|| !a.begindate.hasvalue我得到的記錄較少,所以這意味着它應該在那裏。如果我讀完整行,說明得到的所有記錄都已經生成,並且不能顯示爲今天的日期,或者給出所有記錄,這些記錄表明 說明沒有價值。請在此聲明中做一些小的澄清? – ethem 2011-05-02 13:30:45

+0

@mesut:當然。原因如下:你只想檢查日期,如果設置了,那麼檢查'HasValue'。現在'(a.begindate。HasValue && a.begindate <= DateTime.Now)'返回true,如果(a)日期被設置並且(b)它現在小於或等於現在。您還希望擁有所有沒有設置日期的記錄。但是,如果未設置日期,則'(a.begindate.HasValue && a.begindate <= DateTime.Now)'返回false,因爲'a.begindate.HasValue'爲false。還要返回沒有日期設置的記錄,我用'!a.begindate.HasValue'添加了零件。 – 2011-05-02 13:37:02

-2

嘗試從

query = query.Where(a => a.no_group == group); 

更改爲

query = query.SingleOrDefault(a => a.no_group == group); 
+0

這是別的......真的男生,讀了這個問題。 – 2011-05-02 12:53:50

1

這不是當您使用HasValue,是時候ñ您使用Where作爲條件。

如果你想檢查是否有是符合HasValue狀況的任何元素,你應該使用Any而不是Where

if (query.Any(a => a.begindate.HasValue)) 
+0

真的,爲什麼你們都發布這樣的廢話?這完全是另一回事 – 2011-05-02 12:52:28

+0

@Daniel Hilgarth:因爲//給出錯誤評論。 – 2011-05-02 12:56:22

+0

而且?當然,它會給出錯誤,因爲它是無效的。你的答案和所有其他答案表明你沒有閱讀他的問題,因爲你的答案在語義上與他試圖達到的不同。他試圖在第一個查詢中的問題中清楚地說明了他的想法! – 2011-05-02 12:58:08

相關問題