Разделение подзапросов linq на функции - PullRequest
0 голосов
/ 22 июля 2011

Простите, если об этом спрашивали раньше, но я не уверен, что именно то, что я спрашиваю, будет названо, что затрудняет его поиск.

В настоящее время у меня есть следующий запрос 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-entity генерирует из него один запрос на соединение, и все отлично. Однако в некоторых других частях моего кода я заметил следующее:

(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 голосов
/ 22 июля 2011

Пример метода расширения типа 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();

(Я действительно не знаю, правильный ли последний синтаксис, поскольку я никогда не пишу операторы Linq с ключевым словом from, я использую лямбды).

Если я правильно переведу, это будет:

List<string> patientStrings = database.PatientSet
    .Where(patient => patient.IsActive && patient.Account == r.Account)
    .ToString()
    .ToList();
0 голосов
/ 22 июля 2011

Вы можете использовать функцию расширения, как показано ниже:

 private Func<DataClasses, String> FunctionName(string account)
 {
      return (from patient in database.PatientSet
        where patient.IsActive && patient.Account == r.Account
        select patient).FirstOrDefault()
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...