LINQ方法语法 - 如何完成动态Linq语句

时间:2011-05-02 09:51:51

标签: c# linq linq-to-sql

我使用Linq to Entities从DB中检索我的记录。以下功能是一种方法。 Method有一些参数(参数),如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
}

1 个答案:

答案 0 :(得分: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>();

很多更清晰,更易读,并且由于语言的原因,也解决了复制问题。