2011-05-09 47 views
0

我有一个传递一个或多个提供程序代码的WebGet。对于每个供应商代码,我需要为其所在代码存在的所有住院患者返回患者列表,作为接受,出席或咨询供应商。在WCF数据服务中构建LINQ查询的Where子句

应该是:

WHERE (inpatient = 1) 
AND (dischargeddate IS NULL) 
AND ((attending = 'SMITH') OR (admitting = 'SMITH') OR (consulting = 'SMITH')) 

的 “for” 循环不附加条件的where子句。我究竟做错了什么??

感谢

[WebGet] 
    public IQueryable<vw_patient> GetInpatients(string providercode, string searchtext) 
    { 
     string[] providers = providercode.Split(new char[] { '|' }); 

     if (string.IsNullOrEmpty(searchtext)) 
     { 
      var results = (from p in this.CurrentDataSource.vw_patient 
          where p.inpatient.Equals(true) 
          && p.dischargedate.Equals(null) 
          select p); 

      foreach (string provider in providers) 
      { 
       results = results.Where<vw_patient>(e => e.attending.Equals(provider) || e.admitting.Equals(provider) || e.consulting.Contains(provider)); 
      } 

      results.OrderBy(p => p.roomloc).ThenByDescending(p => p.patientname); 
      return results; 
     } 
     else 
     { 
      var results = (from p in this.CurrentDataSource.vw_patient 
          where p.patientname.StartsWith(searchtext) 
          && p.inpatient.Equals(true) 
          && p.dischargedate.Equals(null) 
          select p); 

      foreach (string provider in providers) 
      { 
       results = results.Where<vw_patient>(e => e.attending.Equals(provider) || e.admitting.Equals(provider) || e.consulting.Contains(provider)); 
      } 

      results.OrderBy(p => p.roomloc).ThenByDescending(p => p.patientname); 
      return results; 
     } 
    } 

回答

0

我想你可能需要把查询的结果为临时存储变量(例如List<vw_patient>),然后追加一条到主列表。喜欢的东西: -

既然这样,你是在循环的每次迭代覆盖results变量

List<vw_patient> fullList = new List<vw_patient>(); 

foreach (string provider in providers){ 
    results = results.Where<vw_patient>(
     e => e.attending.Equals(provider) || 
      e.admitting.Equals(provider) || 
      e.consulting.Contains(provider) 
    ); 
    fullList.AddRange(result.ToList<vw_patient>()); 
} 
+0

谢谢邓肯......这很好! 我假设这是返回结果的方式: return fulllist.AsQueryable (); – user680891 2011-05-11 12:49:39

+0

@ user680891:没有probs。返回看起来也不错。 – 2011-05-11 12:54:46

0

在地方的

foreach (string provider in providers) 
{ 
    results = results.Where<vw_patient>(e => e.attending.Equals(provider) || e.admitting.Equals(provider) || e.consulting.Contains(provider)); 
} 

你可以这样做:

results.Where(e => providers.Contains(e.attending) || providers.Contains(e.admitting) || providers.Contains(e.admitting));