Ну, основное отличие, которое я вижу, это когда запрос выполняется и что еще вы можете сделать с запросом.
Например, предположим, что у вашего объекта 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(). (Я, вероятно, не сделал бы их свойств самостоятельно, но это всего лишь вопрос личных предпочтений.) Таким образом, вы можете получить гибкость, которая вам нужна, когда она вам действительно нужна, но иметь простой способ просто получить текущего клиента в качестве объекта ,
Можете ли вы объяснить, почему вы не сделали бы их свойствами? Благодарю. – Tarik
@Tarik: Похоже, что они делают слишком много работы, чтобы быть свойствами - по крайней мере, если она фактически выполняет запрос базы данных. Обычно я не ожидаю, что свойство getter сделает много работы. С другой стороны, я полагаю, что многие LINQ работают со свойствами, которые * делают * делают запросы, поэтому он вписывается в это. Это действительно личное предпочтение. –
Благодарим за рекомендацию. – Tarik