Одним из основных преимуществ IQueryable (и это также довольно хороший риск для безопасности) является то, что вы МОЖЕТЕ создать запрос на стороне клиента и сериализовать его обратно на сервер для обработки на сервере. Здесь необходимо, чтобы он возвращал определенный тип (в вашем случае IQueryable, где User - это тип, который должен возвращаться в коллекции, поддерживающей IEnumerable <>.
Я взял свой пример у Шона Вильдермута (wildermuth.com) и немного подправил его. Это то, что я использую в своей «модели» на стороне клиента.
publicvoid PerformQuery<T>(EntityQuery<T> qry, EventHandler<EntityResultsArgs<T>> evt, object pUserState = null, bool NoRecordsThrow = False, LoadBehavior pLoadBehavior = LoadBehavior.MergeIntoCurrent ) where T : Entity
{
ModelDataContext.Load<T>(
qry,
pLoadBehavior,
r =>
{
if (evt != null)
{
try
{
if (r.HasError)
{
#if DEBUG
System.Diagnostics.Debugger.Break();
#endif
//internal class to record error messages
AppMessages.ErrorMessage.Display(string.Concat(r.Error.Message, Environment.NewLine, "------------------------", "------- Stack Trace ------", Environment.NewLine, r.Error.StackTrace));
}
else if (r.Entities.Count() > 0 || NoRecordsThrow)
evt(this, new EntityResultsArgs<T>(r.Entities, r.UserState));
}
catch (Exception ex)
{
#if DEBUG
System.Diagnostics.Debugger.Break();
#endif
evt(this, new EntityResultsArgs<T>(ex));
}
}
},
pUserState);
}
Когда бы я тогда использовал это так:
var UserQuery = <DomainServiceName>.Users.Where(pUser => pUsers.City == "Calgary");
PerformQuery<User>(UserQuery, UserQueryComplete)
Недостатком является то, что через эту одну конечную точку пользовательские данные могут быть извлечены с помощью любого вида фильтра, который выдается на стороне клиента ....
НТН,
Ричард