我有一个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>
?
有人可以建议更好的做法吗?请帮忙。
答案 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();