2016-09-23 2 views
0

У меня есть список на SharePoint, где я пытаюсь загрузить поля для этого списка, как следующее:Создание многоразовой LINQ Expression

 var lists = context.Web.Lists; 
     context.Load(lists, n => n.Include(x => x.Title, 
              x => x.Fields.Include(
               z => z.Title, 
               z => z.InternalName, 
               z => z.TypeDisplayName))); 
     context.ExecuteQuery(); 

Следующая часть кода я использую довольно часто в моем коде, во время работы с другими списками:

      x => x.Fields.Include(
               z => z.Title, 
               z => z.InternalName, 
               z => z.TypeDisplayName) 

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

Я попытался создать пользовательское расширение LINQ, но оно не получилось, поскольку оно, вероятно, ожидает вид Expression<Func<T,Y>> (я думаю).

Любая помощь по этому вопросу была бы более чем оценена!

+0

Можете ли вы добавить объявление типа полей? – Groo

+2

Посмотрите здесь: http://stackoverflow.com/a/3365972/6741868 –

+0

Все эти ответы оценивают выражение прямо сейчас, но в этом случае нет ничего под моими списками, пока я не вызову 'context.ExecuteQuery() 'где только afterwads он загружает все объекты –

ответ

1

Поскольку метод Load ожидает Expression<Func<T, object>> и lists предположительно IQueryable<Something> вы можете использовать что-то вроде:

public static Expression<Func<IQueryable<Something>, Object>> IncludeCommonFields() 
{ 
    // since the method returns an Expression, this will actually 
    // get compiled to an expression tree 
    return input => input.Fields.Include(z => z.Title, 
             z => z.InternalName, 
             z => z.TypeDisplayName); 
} 

Оценка функции должны создать новый экземпляр дерева выражений:

var lists = context.Web.Lists; 
context.Load(lists, n => n.Include(x => x.Title, 
            IncludeCommonFields()); 
context.ExecuteQuery(); 

Если это вызвано часто, вы также можете создать экземпляр только один раз:

static readonly Expression<Func<IQueryable<Something>, Object>> _commonIncludes 
    = input => input.Fields.Include(z => z.Title, 
             z => z.InternalName, 
             z => z.TypeDisplayName); 

context.Load(lists, n => n.Include(x => x.Title, 
            _commonIncludes); 
+0

Отказ от ответственности: я никогда не использовал EF 4.1, поэтому я не уверен в подписи' Include', я предполагаю, что это [метод расширения для 'IQueryable '] (https://msdn.microsoft. ком/EN-US/библиотека/gg671236 (v = vs.103) .aspx). – Groo

+0

Я уже пытался это сделать, но это не удается, поскольку оно пытается оценить выражение сразу, а не оценивать его сразу, когда я вызываю 'context.ExecuteQuery()' –

+0

@RobertJ: это странно, можете ли вы опубликовать, как вы использовал метод? Тип возвращаемого значения по-прежнему «IQueryable », поэтому в это время ничего не следует оценивать. – Groo

Смежные вопросы