【问题标题】:Separating linq sub-queries into functions将 linq 子查询分离为函数
【发布时间】:2011-07-22 12:42:56
【问题描述】:

如果以前有人问过这个问题,请原谅我,但我不确定我要问的究竟是什么,这使得搜索变得困难。

我目前有以下 LINQ 查询(使用 linq 到实体):

results = (from r in query
       select new PatientReport
       {
           Report = r,
           Patient = (from patient in database.PatientSet
                     where patient.IsActive && patient.Account == r.Account
                     select patient).FirstOrDefault()
       }).ToList();

现在这很好用,linq-to-entities 会从中生成一个连接查询,而且一切都很好。但是,我注意到在我的代码的其他几个部分中,我有以下内容:

(from patient in database.PatientSet 
where patient.IsActive && patient.Account == r.Account
select patient).FirstOrDefault()

现在,我的问题是: 是否有可能拥有与第一个 sn-p 行为相同但看起来像这样的代码:

results = (from r in query
       select new PatientReport
       {
           Report = r,
           Patient = database.GetActivePatient(r.Account)
       }).ToList();

并且在 Database 类中(或者可能在 Patient 中,或者作为扩展方法),有一个函数可以组装以下查询(显然不执行它,因为它不能作为其他的一部分运行)查询):

public xx GetActivePatient(string account)
{
    return (from patient in database.PatientSet
            where patient.IsActive && patient.Account == r.Account
            select patient).FirstOrDefault()
}

虽然我知道 GetActivePatient 的签名可能会非常多毛并且充满 IQueryable 或 IExpression 等。

实际上,我正在尝试创建一个函数来创建一个查询,该查询可用作其他查询的一部分。

感谢任何帮助(即使是“不,这是不可能的”)。谢谢。

【问题讨论】:

    标签: c# linq linq-to-entities


    【解决方案1】:

    您可以使用如下扩展功能:

     private Func<DataClasses, String> FunctionName(string account)
     {
          return (from patient in database.PatientSet
            where patient.IsActive && patient.Account == r.Account
            select patient).FirstOrDefault()
     }
    

    【讨论】:

    • 不确定我是否完全理解 - 对于初学者来说,我不需要传递数据上下文(或 IQueryable 数据集)吗?
    【解决方案2】:

    ToString() 类型扩展方法示例:

    public static IEnumerable<string> ToString<T>(this IEnumerable<T> list)
    {
        return list.Select(t => t.ToString());
    }
    

    这现在可以用于类似的东西。

    List<string> patientStrings = (from patient in database.PatientSet
            where patient.IsActive && patient.Account == r.Account
            select patient).ToString().ToList();
    

    (我真的不知道最后的语法是否正确,因为我从不使用 'from' 关键字编写 Linq 语句,我使用 lambdas。)

    如果我翻译得当,那就是:

    List<string> patientStrings = database.PatientSet
        .Where(patient => patient.IsActive && patient.Account == r.Account)
        .ToString()
        .ToList();
    

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2018-12-09
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多