2011-05-02 57 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