Ответ 1
Я бы сказал, что ваш вопрос уже содержит правильный ответ в некоторой степени.
Чтобы определить, загружено ли свойство объекта клиента, или нет, доступны следующие методы:
- Метод ClientObject.IsPropertyAvailable method указывает, указанное свойство скалярное было восстановлено или установлено
- ClientObject.IsObjectPropertyInstantiated method указывает определяется ли указанное свойство объекта клиента
Испытания
Тестовый случай 1: загрузка только скалярного свойства
ctx.Load(ctx.Web, w => w.Title);
ctx.ExecuteQuery();
//Results:
ctx.Web.IsObjectPropertyInstantiated("Lists") False
ctx.Web.IsPropertyAvailable("Title") True
Тестовый кейс 2: загрузить только составное свойство
ctx.Load(ctx.Web, w => w.Lists);
ctx.ExecuteQuery();
//Results:
ctx.Web.IsObjectPropertyInstantiated("Lists") True
ctx.Web.IsPropertyAvailable("Title") False
Тестовый кейс 3: загрузка как скалярных, так и составных свойств
ctx.Load(ctx.Web, w=>w.Lists,w=>w.Title);
ctx.ExecuteQuery();
//Results
ctx.Web.IsObjectPropertyInstantiated("Lists") True
ctx.Web.IsPropertyAvailable("Title") True
Как динамически определить, загружено ли свойство объекта клиента?
Так как ClientObject.IsPropertyAvailable и ClientObject.IsObjectPropertyInstantiated методы ожидайте, что имя свойства будет указано как строковое значение, и это может привести к опечаткам, я обычно предпочитаю следующий метод расширения:
public static class ClientObjectExtensions
{
/// <summary>
/// Determines whether Client Object property is loaded
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="clientObject"></param>
/// <param name="property"></param>
/// <returns></returns>
public static bool IsPropertyAvailableOrInstantiated<T>(this T clientObject, Expression<Func<T, object>> property)
where T : ClientObject
{
var expression = (MemberExpression)property.Body;
var propName = expression.Member.Name;
var isCollection = typeof(ClientObjectCollection).IsAssignableFrom(property.Body.Type);
return isCollection ? clientObject.IsObjectPropertyInstantiated(propName) : clientObject.IsPropertyAvailable(propName);
}
}
Использование
using (var ctx = new ClientContext(webUri))
{
ctx.Load(ctx.Web, w => w.Lists, w => w.Title);
ctx.ExecuteQuery();
if (ctx.Web.IsPropertyAvailableOrInstantiated(w => w.Title))
{
//...
}
if (ctx.Web.IsPropertyAvailableOrInstantiated(w => w.Lists))
{
//...
}
}