Краткий ответ: Боюсь, вы мало что можете легко сделать. Проблема в том, что вам нужно параметризовать запрос. Однако запрос должен быть представлен в виде дерева выражений (чтобы его можно было преобразовать в SQL или в любой другой формат EF). К сожалению, в C # нет элегантных способов составления деревьев выражений.
Длинный ответ: Некоторое время назад я написал статью на C #, в которой объясняется , как составлять запросы (используя некоторые приемы) - вы можете взять дерево выражений и объединить его в параметризованный запрос. Таким образом, в принципе вы можете использовать методы из этой статьи, чтобы создать метод, который принимает изменяющиеся части дерева выражений, а затем составляет запрос.
Я буду использовать типы, используемые в LINQ to SQL, потому что я более знаком с ним, но я считаю, что принцип должен быть таким же:
IQueryable<R> GetInfo<T>(IQueryable<T> source, // e.g. context.Students
Expression<Func<T, IQueryable<Address>>> getAddr, // x => x.adresses
Expression<Func<T, Address, R>> getRes // (x, a) => new StudentDTO { ... }
return
from x in source.AsExpandable()
let address = (from a in getAddr(x).Expand() where a.active == true
select a).FirstOrDefault()
select getRes(x, a).Expand();
}
// The use would look like this
var res = GetInfo(context.Professors, x => x.addresses, (x, a) => new
ProfessorDTO { id = x.id, professorname = x.studentname, address = a.address });
Итак, в итоге, C # и LINQ не предоставляют никакой встроенной поддержки, которая упростила бы процесс. Однако с некоторыми усилиями вы можете написать запрос, параметризованный некоторыми частями дерева выражений. В вашем случае это делает код немного короче и менее повторяющимся, но делает его намного более сложным (и вам также нужно использовать библиотеку, подобную той, на которую я ссылался, которая обеспечивает AsExpandable
и Expand
).
В этом случае я боюсь, что это не стоит усилий. Но было бы неплохо, если бы C # v (Next) ^ x предоставил более элегантную поддержку для таких вещей: -)