Фильтр по выбранному перечислимому в запросе linq - PullRequest
1 голос
/ 17 августа 2010

Возможно ли объединить приведенный ниже запрос linq в один запрос?

var checkBoxes = from x in FindAll<CheckBox>()
                 where x.Checked
                 select new
                 {
                     RecordType = Type.GetType(x.Attributes["RecordType"]),
                     RecordId = Int32.Parse(x.Attributes["RecordId"])
                 };

checkBoxes = from x in checkBoxes
             where x.RecordType != typeof(DomainModel.Group)
             select x;

Ответы [ 4 ]

5 голосов
/ 17 августа 2010
var checkBoxes = from x in FindAll<CheckBox>()
                 let recordType = Type.GetType(x.Attributes["RecordType"])
                 where x.Checked && recordType != typeof(DomainModel.Group)
                 select new
                 {
                     RecordType = recordType,
                     RecordId = Int32.Parse(x.Attributes["RecordId"])
                 };
3 голосов
/ 17 августа 2010

Ответ lasseespeholt совершенно хорош (желательно, даже - нет смысла делать проекцию, если вы собираетесь отбросить результат), но если вы хотите применить это более широко, вы можете использовать запрос продолжение :

var checkBoxes = from x in FindAll<CheckBox>()
                 where x.Checked
                 select new
                 {
                     RecordType = Type.GetType(x.Attributes["RecordType"]),
                     RecordId = Int32.Parse(x.Attributes["RecordId"])
                 } into y
                 where y.RecordType != typeof(DomainModel.Group)
                 select y;

Здесь я изменил вторую переменную с x на y, чтобы было ясно, что она отличается от оригинальной x, но у вас нетчтобы сделать это.

Еще одна альтернатива, которая избегает двойного вызова Type.GetType, но все же помещает предложение where перед окончательным проецированием, заключается в использовании предложения let (которое, по общему признанию, вводит другой проект):1013 *

var checkBoxes = from x in FindAll<CheckBox>()
                 where x.Checked
                 let t = Type.GetType(x.Attributes["RecordType]")
                 where t != typeof(DomainModel.Group)
                 select new
                 {
                     RecordType = t
                     RecordId = Int32.Parse(x.Attributes["RecordId"])
                 };
0 голосов
/ 17 августа 2010

Почему вы хотите перейти на один запрос linq? Linq использует отложенное выполнение и будет выполняться только тогда, когда вы где-то фактически используете вывод. В то же время он продолжает строить дерево выражений. То, что у вас есть, отлично читается. Я бы изменил его, только если вы думаете, что это делает его более читабельным.

0 голосов
/ 17 августа 2010
var checkboxes = FindAll<CheckBox>()
                  .Where(x => x.Checked && Type.GetType(x.Attributes["RecordType"]) != typeof(DomainModel.Group))
                  .Select(new{
                          RecordType = Type.GetType(x.Attributes["RecordType"]),
                          RecordId = Int32.Parse(x.Attributes["RecordId"])
                  });
...