Вопрос Linq to SQL - указание столбцов и изменение столбца - PullRequest
0 голосов
/ 19 июня 2009

Я пытаюсь написать метод linq to sql, который обрабатывает сортировку, разбиение по страницам и фильтрацию для сетки ajax. Я создал частичный класс Employee, который имеет TotalRecordCount, так как мне нужно передать это в JavaScript для настройки пейджера. Проблема в том, что он не будет собираться, потому что я не могу установить AnonymousType # 1.TotalRecordCount, он только для чтения. Тем не менее, если я выберу «выбрать нового сотрудника», он выдаст исключение - «Явное построение типа сущности 'InVision.Data.Employee' в запросе не разрешено."

Вот код ...

public string GetPageJSON(string sortColumn, string sortDirection, int pageNumber, int pageSize, EmployeeSearch search)
        {
            var query = from e in db.Employees
                        select new
                        {
                            EmployeeID = e.EmployeeID,
                            FirstName = e.FirstName,
                            LastName = e.LastName,
                            LoginName = e.LoginName,
                            IsLockedOut = e.IsLockedOut,
                            TotalRecordCount = e.TotalRecordCount
                        };
            //searching.
            if (search.FirstName.Length > 0) query = query.Where(e => e.FirstName.Contains(search.FirstName));
            if (search.LastName.Length > 0) query = query.Where(e => e.LastName.Contains(search.LastName));
            if (search.LoginName.Length > 0) query = query.Where(e => e.LoginName.Contains(search.LoginName));
            if (search.Status.Length > 0) query = query.Where(e => (search.Status == "Active" && !e.IsLockedOut) 
                || (search.Status == "Inactive" && e.IsLockedOut));
            //sorting.
            query = query.OrderBy(sortColumn, sortDirection);
            //get total record count.
            int totalRecordCount = query.Count();
            //paging.
            query = query.Skip((pageNumber - 1) * pageSize).Take(pageSize);
            //set total record count.
            var list = query.ToList();
            if (list.Count > 0)
            {
                list[0].TotalRecordCount = totalRecordCount; //throws exception
            }
            //return json.
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(list);
        }

Ответы [ 2 ]

1 голос
/ 19 июня 2009

Я закончил тем, что использовал пользовательский класс представления, чтобы заставить это работать ...

partial class EmployeeView
    {
        public int EmployeeID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string LoginName { get; set; }
        public bool IsActive { get; set; }
        public int TotalRecordCount { get; set; }
    }

public string GetPageJSON(string sortColumn, string sortDirection, int pageNumber, int pageSize, EmployeeSearch search)
        {
            var query = from e in db.Employees
                        select new EmployeeView
                        {
                            EmployeeID = e.EmployeeID,
                            FirstName = e.FirstName,
                            LastName = e.LastName,
                            LoginName = e.LoginName,
                            IsActive = !e.IsLockedOut,
                            TotalRecordCount = 0
                        };
            //searching.
            if (search.FirstName.Length > 0) query = query.Where(e => e.FirstName.Contains(search.FirstName));
            if (search.LastName.Length > 0) query = query.Where(e => e.LastName.Contains(search.LastName));
            if (search.LoginName.Length > 0) query = query.Where(e => e.LoginName.Contains(search.LoginName));
            if (search.Status.Length > 0) query = query.Where(e => (search.Status == "Active" && e.IsActive) 
                || (search.Status == "Inactive" && !e.IsActive));
            //sorting.
            query = query.OrderBy(sortColumn, sortDirection);
            //get total record count.
            int totalRecordCount = query.Count();
            //paging.
            query = query.Skip((pageNumber - 1) * pageSize).Take(pageSize);
            //set total record count.
            var list = query.ToList();
            if (list.Count > 0)
            {
                list[0].TotalRecordCount = totalRecordCount;
            }
            //return json.
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(list);
        }
1 голос
/ 19 июня 2009

Вы хотите выбрать исходные объекты, а не отображать их на новые объекты (того же типа или анонимного типа).

Заменить это:

var query = from e in db.Employees
                        select new
                        {
                            EmployeeID = e.EmployeeID,
                            FirstName = e.FirstName,
                            LastName = e.LastName,
                            LoginName = e.LoginName,
                            IsLockedOut = e.IsLockedOut,
                            TotalRecordCount = e.TotalRecordCount
                        };

С этим:

var query = db.Employees.AsQueryable();

Затем замените это:

var list = query.ToList();
if (list.Count > 0)
{
    list[0].TotalRecordCount = totalRecordCount;
}

С этим:

var list = from e in query
           select new
           {
               EmployeeID = e.EmployeeID,
               FirstName = e.FirstName,
               LastName = e.LastName,
               LoginName = e.LoginName,
               IsActive = !e.IsLockedOut,
               TotalRecordCount = totalRecordCount
           };

Я думаю, что это должно быть все. Если для JavaScriptSerializer требуется List, просто убедитесь, что вы используете его следующим образом: return serializer.Serialize(list.ToList());

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