Refactor выбрать часть выражения Linq? - PullRequest
5 голосов
/ 17 декабря 2008

Я играю с некоторыми вещами Linq-SQL, делая что-то вроде этого:

var foo = from f in db.Foo where f.Bar > 5 select f;

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

var foo = from f in db.Foo where f.Bar > 5 select new { f.Bar, f.Baz };

Что я хочу знать, могу ли я выделить выбранную часть этого запроса, если я хочу во время выполнения определить, какие части Foo выбрать? Такие как:

var foo = from f in db.Foo where f.Bar > 5 select SomeMethodThatReturnsThePropertiesOfFooIReallyWant();

Изменить, чтобы уточнить: я ищу синтаксис и тип возврата SomeMethod ... ().

Если бы я хотел сделать это несколько раз:

select new { f.Bar, f.Baz };

но в другое время делайте это:

select new { f.Baz, f.Other };

Основываясь на данных в памяти (без гигантских операторов ввода), как мне это сделать, если это возможно?

Ответы [ 5 ]

2 голосов
/ 17 декабря 2008

Конечно, хотя в беглом синтаксисе проще:

var query_foo = db.Foo.Where(f=>f.Bar >  5);
//  :
var foo =query_foo.Select(f=>SomeMethodThatReturnsEtc(f));
0 голосов
/ 23 марта 2009

Иногда самое простое, что можно сделать, это просто создать простой класс данных с кучей публичных get; и установить; так что вы можете выбрать свои данные в этом классе. Если вы имеете дело с обнуляемыми типами, которые будут довольно понятны при использовании данных, хотя, если это все строки, вы можете найти что-то более чистое, когда придет время потреблять данные.

Простой пример

public class MyData {
public string Bar {get;set;}
public int? Baz {get;set;}
public DateTime? {get;set;}
}

var foo = from f in db.Foo where f.Bar > 5 select new MyData { Bar = f.Bar, Foo = f.Foo };

Вы также можете разделить ваши операторы следующим образом, если вы хотите, чтобы оператор select находился в другом месте, чем оператор SELECT, он попадет на сервер только при попытке перечислить его.

var foo = from f in db.Foo where f.Bar > 5 select f;
var fooData = f.Select(new MyData .... }
0 голосов
/ 23 марта 2009

вы не можете возвращать анонимные типы из функции, поэтому вы застряли бы с объявленными типами, что противоречит вашему вопросу, или с Object, который не очень поможет.

Более конкретно, что именно вы ожидаете сделать со своим результатом? Если члены на самом деле неизвестны во время компиляции, я не уверен, что вы можете с этим сделать ...

0 голосов
/ 23 марта 2009

Вам нужно будет динамически построить небольшое проекционное (Выбрать) выражение, чтобы привязать к базовому запросу, который фильтрует. См. Один из следующих примеров для некоторых примеров:

Dynamic.cs в образце динамического запроса, который поставляется с VS 2008

http://www.albahari.com/nutshell/predicatebuilder.aspx

0 голосов
/ 18 декабря 2008

Полагаю, мой настоящий вопрос в том, что синтаксис SomeMethod ()? - Джонас (час назад)

Как вы хотите сделать, вы можете только вернуть «объект» из метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...