将linq子查询分成函数

时间:2011-07-21 23:50:48

标签: c# linq linq-to-entities

请原谅我,如果以前曾经问过这个问题,但我不确定究竟会问我的问题,这会让搜索变得困难。

我目前有以下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()

现在,我的问题是: 是否可以使代码与第一个代码段的行为相同,但看起来像这样:

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等。

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

任何帮助(即使它是'不,这是不可能')表示赞赏。感谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

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