2011-05-02 88 views
2

我使用LINQ到實體檢索從DB我的記錄。下面的函數在一個方法中。方法有一些參數(參數)類基團,datefrom,dateto,地點,狀態,SEARCHTEXT等等,等等LINQ方法語法 - 如何實現動態的LINQ語句

的整體思路是,如果這些參數不爲空或null,則實現LINQ statments。我正在做的方式是檢查是否有價值。如果它有價值,那麼我通過例如a.no_group = group如果它沒有一個值,那麼我會傳遞一個像a.id!= - 1這樣的語句,這總是正確的。

問題: 我的意思是我不開心,在每個語句通過像這始終是真正的「a.id = -1!」。我使用這個,因爲我必須在那裏放置一個值。但我不喜歡這樣做...(它的工作原理!)

問題: 問題是:這種正確的做法? 1-可以用別的東西替換a.id!= -1嗎?

2 - 如果你看到整個LINQ語句是因爲語言的檢查重複。正如你看到最後的 linq語句檢查語言「荷蘭語」或「法語」......如何避免重複?

3-我檢查當前日期(datetime.now)是否date_begin和DATE_END之間。這是正確的方式...

整個代碼工作正常,但我覺得我複雜,可以簡單得多的代碼...

怎麼會呢?

if (Language == ConfBouwHelper.LanguageEnum.French) 
{ 
//FRENCH RECORDS 
listAgendaItems = dc.agenda.Where(a => 
    ((String.IsNullOrEmpty(group)) ? (a.id != -1) : (a.no_group == group)) 
&& ((activityType.Equals("ALL")) ? (a.id != -1) : (a.type_manifestation == activityType)) 
&& ((String.IsNullOrEmpty(dateFrom)) ? (a.id != -1) : (a.date_debut.Value >= dateFrom)) 
&& ((String.IsNullOrEmpty(dateTo)) ? (a.id != -1) : (a.date_debut.Value <= dateTo)) 
&& ((String.IsNullOrEmpty(place)) ? (a.id != -1) : (a.emplacement.Contains(place))) 
&& ((String.IsNullOrEmpty(state)) ? (a.id != -1) : (a.cd_prov == state)) 
&& ((String.IsNullOrEmpty(searchText)) ? (a.id != -1) : (a.libelle_activite.Contains(searchText))) 
&& ((a.date_begin_display.HasValue ? DateTime.Now >= a.date_begin_display.Value : a.id != -1) && 
    (a.date_end_display.HasValue ? DateTime.Now <= a.date_end_display.Value : a.id != -1)) 
&& (a.langue == "FRENCH" || a.langue == "B")).ToList<agenda>(); //GET FRENCH 
} 
else 
//DUTCH RECORDS 
{ 
listAgendaItems = dc.agenda.Where(a => 
    ((String.IsNullOrEmpty(group)) ? (a.id != -1) : (a.no_group == group)) 
&& ((activityType.Equals("ALL")) ? (a.id != -1) : (a.type_manifestation == activityType)) 
&& ((String.IsNullOrEmpty(dateFrom)) ? (a.id != -1) : (a.date_debut.Value >= dateFrom)) 
&& ((String.IsNullOrEmpty(dateTo)) ? (a.id != -1) : (a.date_debut.Value <= dateTo)) 
&& ((String.IsNullOrEmpty(place)) ? (a.id != -1) : (a.emplacement.Contains(place))) 
&& ((String.IsNullOrEmpty(state)) ? (a.id != -1) : (a.cd_prov == state)) 
&& ((String.IsNullOrEmpty(searchText)) ? (a.id != -1) : (a.libelle_activite.Contains(searchText))) 
&& ((a.date_begin_display.HasValue ? DateTime.Now >= a.date_begin_display.Value : a.id != -1) && 
    (a.date_end_display.HasValue ? DateTime.Now <= a.date_end_display.Value : a.id != -1)) 

&& (a.langue == "DUTCH" || a.langue == "B")).ToList<agenda>(); //GET DUTCH 
} 

回答

2

您可以添加多個where子句:

var query = dc.agenda; 
if(!String.IsNullOrEmpty(group)) 
    query = query.Where(a => a.no_group == group) 
if(!activityType.Equals("ALL")) 
    query = query.Where(a => a.type_manifestation == activityType) 
// and so on for all your conditions... 

if (Language == ConfBouwHelper.LanguageEnum.French) 
    query = query.Where(a => (a.langue == "FRENCH" || a.langue == "B")); 
else 
    query = query.Where(a => (a.langue == "DUTCH" || a.langue == "B")); 

listAgendaItems = query.ToList<agenda>(); 

這是很多清潔和可讀性,也因爲語言的複製解決問題。

+0

哇...價格高...感謝這麼多。 – ethem 2011-05-02 10:20:41

+0

嗨丹尼爾,我發佈了一個基於你的建議的相關問題。你能諮詢一下嗎?這是鏈接:http://stackoverflow.com/questions/5857261/linq-method-syntax-can-not-convert-iqueryable-to-bool – ethem 2011-05-02 12:45:27

+0

@mesut:請參閱我的回答你的新問題**和無視所有其他**,因爲他們錯了...... – 2011-05-02 12:53:19