Ответ 1
Я бы ожидал, что просто не получится; Select
откладывается, поэтому на данный момент данные не потребляются. Однако, поскольку вы настроили контекст данных (перед тем как покинуть MyFunc
), он никогда не сможет получить данные. Лучшим вариантом является передача контекста данных в метод, чтобы потребитель мог выбрать время жизни. Кроме того, я бы рекомендовал вернуть IQueryable<T>
, чтобы потребитель мог "составить" результат (т.е. Добавить OrderBy
/Skip
/Take
/Where
и т.д. И повлиять на окончательный запрос):
// this could also be an instance method on the data-context
internal static IQueryable<SomeType> MyFunc(
this MyDataContext dc, parameter a)
{
return dc.tablename.Where(row => row.parameter == a);
}
private void UsingFunc()
{
using(MyDataContext dc = new MyDataContext()) {
var result = dc.MyFunc(new a());
foreach(var row in result)
{
//Do something
}
}
}
Обновление: если вы (комментарии) не хотите откладывать выполнение (т.е. вы не хотите, чтобы вызывающий абонент имел дело с контекстом данных), вам необходимо оценить результаты. Вы можете сделать это, вызвав .ToList()
или .ToArray()
в результате для буферизации значений.
private IEnumerable<SomeType> MyFunc(parameter a)
{
using(MyDataContext dc = new MyDataContext)
{
// or ToList() etc
return dc.tablename.Where(row => row.parameter == a).ToArray();
}
}
Если вы хотите сохранить его в этом случае, вам нужно использовать "блок итератора":
private IEnumerable<SomeType> MyFunc(parameter a)
{
using(MyDataContext dc = new MyDataContext)
{
foreach(SomeType row in dc
.tablename.Where(row => row.parameter == a))
{
yield return row;
}
}
}
Теперь это отложено без передачи контекста данных.