LINQ to SQL Запросы странная материализация - PullRequest
2 голосов
/ 27 мая 2010

На днях я наткнулся на интересную функцию Linq to SQL. Возможно, кто-то может дать мне логическое объяснение причин, лежащих в основе результатов. Возьмите приведенный ниже код в качестве моего примера, который использует настройку базы данных AdventureWorks в Linq to SQL DataContext. Это клип из моего модульного теста. Получившийся клиент вернулся из вызова к CustomerQuery_Test_01 () и CustomerQuery_Test_02 () одинаков. Тем не менее, запросы, выполняемые на SQLServer, отличаются друг от друга. Метод CustomerQuery_Test_01 позволяет нам материализовать всю таблицу Customer, а при вызове CustomerQuery_Test_02 материализуется только один клиент. Полученные SQL-запросы находятся внизу этого поста. У кого-нибудь есть веская причина для этого? Для меня это было очень не интуитивно понятно.

protected virtual Customer GetByPrimaryKey(Func<Customer, bool> keySelection)
{
    AdventureWorksDataContext context = new AdventureWorksDataContext();
    return (from r in context.Customers select r).SingleOrDefault(keySelection);
}

[TestMethod]
public void CustomerQuery_Test_01()
{
    Customer customer = GetByPrimaryKey(c => c.CustomerID == 2);
}

[TestMethod]
public void CustomerQuery_Test_02()
{
    AdventureWorksDataContext context = new AdventureWorksDataContext();
    Customer customer = (from r in context.Customers select r).SingleOrDefault(c => c.CustomerID == 2);
}

Запрос для CustomerQuery_Test_01 (обратите внимание на отсутствие предложения where)

SELECT [t0]. [CustomerID], [t0]. [NameStyle], [t0]. [Title], [t0]. [FirstName], [t0]. [MiddleName], [t0]. [LastName ], [t0]. [Суффикс], [t0]. [CompanyName], [t0]. [SalesPerson], [t0]. [EmailAddress], [t0]. [Phone], [t0]. [PasswordHash], [t0]. [PasswordSalt], [t0]. [rowguid], [t0]. [ModifiedDate] ОТ [SalesLT]. [Заказчик] AS [t0]

Запрос для CustomerQuery_Test_02 (обратите внимание на предложение where)

SELECT [t0]. [CustomerID], [t0]. [NameStyle], [t0]. [Title], [t0]. [FirstName], [t0]. [MiddleName], [t0]. [LastName ], [t0]. [Суффикс], [t0]. [CompanyName], [t0]. [SalesPerson], [t0]. [EmailAddress], [t0]. [Phone], [t0]. [PasswordHash], [t0]. [PasswordSalt], [t0]. [rowguid], [t0]. [ModifiedDate] ОТ [SalesLT]. [Заказчик] AS [t0] ГДЕ [t0]. [CustomerID] = @ p0

1 Ответ

1 голос
/ 28 мая 2010
Func<Customer, bool> keySelection

Это не Expression<Func<Customer, bool>> ... компилятор разрешил Enumerable.Single вместо Queryable.Single

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...