Ну, главное отличие, которое я вижу, это когда запрос выполняется и что еще можно сделать с запросом.
Например, предположим, что у вашего Customer
объекта есть несколько больших полей. Используя второй подход, вы всегда получите их. Используя первый подход, вы могли бы написать:
string name = helper.CurrentCustomer.Select(x => x.Name).First();
Тогда потребуется запросить только одно поле в базе данных. С точки зрения времени, запрос будет выполняться только тогда, когда вы фактически запросите данные (то есть, как он может ждать до тех пор, пока вы не использовали Select
, чтобы определить, что поместить в запрос в приведенном выше случае). У этого есть свои плюсы и минусы - это может усложнить размышления, но также может спасти некоторую работу. С точки зрения «рассуждений о», вы знаете, что, получив клиента, вы получаете объект, с которым можете просто работать. Если вы используете один и тот же запрос дважды, вам нужно знать, собирается ли ваш поставщик запросов LINQ кэшировать результат ... если вы напишите:
IQueryable<Customer> currentCustomerQuery = helper.CurrentCustomer;
Customer x = currentCustomerQuery.First();
Customer y = currentCustomerQuery.First();
это выдаст запрос один или два раза? Я подозреваю, что это очень сильно зависит от провайдера, но я не хотел бы делать предположения о конкретных.
Другая вещь, о которой стоит подумать, это то, насколько легко использовать создаваемый вами API. Лично мне обычно проще использовать API, который дает мне нужные данные, а не запрос, из которого я могу получить эти данные. С другой стороны, он является немного менее гибким.
Один из вариантов - разрешить оба - иметь методы GetCurrentCustomerQuery () и GetCurrentCustomer (). (Я бы, наверное, не сделал бы их свойства сам, но это просто вопрос личных предпочтений.) Таким образом, вы можете получить необходимую гибкость, когда вам это действительно нужно, но есть простой способ просто получить текущего клиента как объект .