在linq中分页到sql进入列表

时间:2018-04-15 07:56:42

标签: c# linq

我有一个linq to sql查询,它在几个表中执行几个连接以返回我的数据列表。查询工作正常,并返回所有正确的数据。但是,我决定在我的数据表中添加分页,并稍微修改了下面的代码,这样就不会立即从db中获取所有数据。

我遇到的问题是如何正确地将var data内的查询返回的数据添加到allTrucks列表中?

我遇到的例外情况如下:

  

Dynamic Linq中预期的表达式

        List<TruckList> allTrucks = new List<TruckList>();


        try
        {
            using (PaginationContext _db = new PaginationContext())
            {

                var data = (from lad in _db.Jobs

                            join users in _db.Users on lad.Id equals users.Id into
                            ul
                            from users in ul.DefaultIfEmpty()
                            join ladAddressLoading in _db.Addresses.Where(a => a.TAD_N_ID == 1) on lad.Id equals ladAddressLoading.Id
                            join ladAddressDelivery in _db.Addresses.Where(a => a.TAD_N_ID == 2) on lad.Id equals ladAddressDelivery.Id
                            join countryLoading in _db.Countries on ladAddressLoading.Id equals countryLoading.Id
                            join countryDelivery in _db.Countries on ladAddressDelivery.Id equals countryDelivery.Id
                            join volume in _db.Measurements on lad.Id equals volume.Id

                            select new
                            {
                                Coordinator = users == null ? "No User" : users.FirstName + " " + users.LastName,
                                Volume = ladAddressLoading.VolumeTotal,
                                DeliveryCountry = countryDelivery.ISO2,
                                DeliveryDate = ladAddressDelivery.From,
                                LoadingCountry = countryLoading.ISO2,
                                LoadingDate = ladAddressLoading.From,

                            }).AsEnumerable()
                      .Select(x => new TruckList()
                      {

                          Coordinator = x.Coordinator,
                          Volume = x.Volume,
                          Delivery = x.DeliveryCountry + " - " + x.DeliveryDate.Value.ToString("dd/MM/yyyy"),
                          Loading = x.LoadingCountry + " - " + x.LoadingDate.Value.ToString("dd/MM/yyyy"),

                      });


                allTrucks.AddRange(data);

                totalRows = allTrucks.Count;


                if (!string.IsNullOrEmpty(searchVal))
                {
                    // filter
                    allTrucks = allTrucks.Where(x => x.FileID.ToLower().Contains(searchVal.ToLower())).ToList<TruckList>();
                }

                totalRowsAfterFilter = allTrucks.Count;

                // sorting

                allTrucks = allTrucks.OrderBy(sortColumnName + " " + sortDirection).ToList<TruckList>();

                // paging 

                allTrucks = allTrucks.Skip(start).Take(length).ToList<TruckList>();

如何直接将linq-to-sql直接分配到List<TruckList>? 有人可以建议更好的做法吗?请帮忙。

2 个答案:

答案 0 :(得分:1)

分成两个查询。变量数据不是TruckList。见下面的代码

                   var data = from lad in _db.Jobs

                                join users in _db.Users on lad.Id equals users.Id into ul
                                from users in ul.DefaultIfEmpty()
                                join ladAddressLoading in _db.Addresses.Where(a => a.TAD_N_ID == 1) on lad.Id equals ladAddressLoading.Id
                                join ladAddressDelivery in _db.Addresses.Where(a => a.TAD_N_ID == 2) on lad.Id equals ladAddressDelivery.Id
                                join countryLoading in _db.Countries on ladAddressLoading.Id equals countryLoading.Id
                                join countryDelivery in _db.Countries on ladAddressDelivery.Id equals countryDelivery.Id
                                join volume in _db.Measurements on lad.Id equals volume.Id

                                select new
                                {
                                    Coordinator = users == null ? "No User" : users.FirstName + " " + users.LastName,
                                    Volume = ladAddressLoading.VolumeTotal,
                                    DeliveryCountry = countryDelivery.ISO2,
                                    DeliveryDate = ladAddressDelivery.From,
                                    LoadingCountry = countryLoading.ISO2,
                                    LoadingDate = ladAddressLoading.From,

                                };



                    List<TruckList> trucks = data.Select(x => new TruckList()
                    {

                            Coordinator = x.Coordinator,
                            Volume = x.Volume,
                            Delivery = x.DeliveryCountry + " - " + x.DeliveryDate.Value.ToString("dd/MM/yyyy"),
                            Loading = x.LoadingCountry + " - " + x.LoadingDate.Value.ToString("dd/MM/yyyy"),

                    });


                    allTrucks.AddRange(trucks);

答案 1 :(得分:0)

就像异常所说的那样 - .OrderBy期望Expression并且您传递的是string

allTrucks = allTrucks.OrderBy(sortColumnName + " " + sortDirection).ToList<TruckList>();

它应该是什么样的

allTrucks = allTrucks.OrderBy(truck => truck.SomeProp).ToList();