【问题标题】:Building where clause for LINQ query in WCF data service在 WCF 数据服务中为 LINQ 查询构建 where 子句
【发布时间】:2011-05-09 15:59:06
【问题描述】:

我有一个 WebGet,它传递了一个或多个提供程序代码。对于每个提供者代码,我需要返回所有住院患者的患者列表,其中他们的代码作为承认、就诊或咨询提供者存在。

应该是:

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;
        }
    }

【问题讨论】:

    标签: c# linq where


    【解决方案1】:

    我认为您可能需要将查询结果放入临时存储变量(例如List&lt;vw_patient&gt;),然后将其附加到主列表中。类似的东西:-

    就目前而言,您将在循环的每次迭代中覆盖 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>());
    } 
    

    【讨论】:

    • 谢谢邓肯...这很棒!我假设这是返回结果的方式: return fulllist.AsQueryable();
    • @user680891:没有问题。回报看起来也不错。
    【解决方案2】:

    代替

    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));
    

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多