Исправлен метод расширения «Take» в LinQ C # - PullRequest
0 голосов
/ 30 марта 2012

Ниже приведен фрагмент кода, я хочу отобразить только 10 записей из таблицы.

AdventureWorksDataContext adc = new AdventureWorksDataContext();    
var query1 = from customers in adc.Customers
                             orderby (customers.FirstName).Take(10)
                             select new
                             {
                                 customers.FirstName,
                                 customers.LastName,
                                 customers.CustomerAddresses
                             };
 foreach (var v in query1)   -> Line 23
            {
                Console.Write(v.FirstName);
                Console.Write("  ");
                Console.Write(v.LastName);
                Console.Write("       ");
                Console.Write(v.CustomerAddresses);
            }

Я получаю следующую ошибку во время выполнения:

Unhandled Exception: System.InvalidOperationException: Cannot order by type 'System.Collections.Generic.IEnumerable`1[System.Char]'.
   at System.Data.Linq.SqlClient.QueryConverter.VisitOrderBy(Expression sequence, LambdaExpression expression, SqlOrderType orderType)
   at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(Method CallExpression mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpres
sion mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
   at System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence,
 LambdaExpression selector)
   at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(Method
CallExpression mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpres
sion mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
   at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node)
   at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNod
eAnnotations annotations)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider
.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.Get
Enumerator()
   at LabAssignment4Part2.AdventureWorks.Main(String[] args) in E:\AdventureWorks.cs:line 23

IПолагаю, я не правильно реализую метод Take.

пожалуйста, помогите мне.

1 Ответ

1 голос
/ 30 марта 2012
AdventureWorksDataContext adc = new AdventureWorksDataContext();    
var query1 = (from customers in adc.Customers
                         orderby (customers.FirstName)
                         select new
                         {
                             customers.FirstName,
                             customers.LastName,
                             customers.CustomerAddresses
                         }).Take(10);
foreach (var v in query1)
        {
            Console.Write(v.FirstName);
            Console.Write("  ");
            Console.Write(v.LastName);
            Console.Write("       ");
            Console.Write(v.CustomerAddresses);
        }

Edit: Take должно происходить с объектом запроса в целом, а не с предложением orderby. Вы также можете сказать foreach (var v in query1.Take(10)), и это будет действительно.

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