我使用Linq to Entities从DB检索我的记录。下面的函数在一个方法中。方法有一些参数(参数),如group, datefrom, dateto, place, state, searchtext等。
的整体思想是,如果这些参数不是空的或null,那么完成LINQ语句。我这样做的方法是检查是否有一个值。如果它有值,那么我传递例如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
}
可以添加多个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>();
这是很多更干净和可读,也解决了由于语言的重复问题。