我无法将EF linq示例转换为OrmLite。我已经掌握了大部分查询,但是一些深度连接或子查询正在解决一些问题。使用OrmLite ServiceStack复杂加入/查询
这是我的EF查询:
var q = from orderProduct in orderProducts
join order in _erpContext.Orders.Include(x => x.BillingAddress.Country) on orderProduct.OrderId equals order.Id
join product in _erpContext.Products.Include(x => x.ProductCategories).Include(x => x.ProductManufacturers) on orderProduct.ProductId equals product.Id
where (storeId == 0 || storeId == order.StoreId) &&
(!startDate.HasValue || startDate.Value <= order.DateCreated) &&
(!endDate.HasValue || endDate.Value >= order.DateCreated) &&
(!orderStatusId.HasValue || orderStatusId == (int)order.OrderStatus) &&
(!orderTypeId.HasValue || orderTypeId == (int)order.OrderType) &&
(!paymentStatusId.HasValue || paymentStatusId == (int)order.PaymentStatus) &&
(!shippingStatusId.HasValue || shippingStatusId == (int)order.ShippingStatus) &&
(!order.Deleted) &&
(!product.Deleted) &&
(categoryId == 0 || product.ProductCategories.Count(pc => pc.CategoryId == categoryId) > 0) &&
(manufacturerId == 0 || product.ProductManufacturers.Count(pm => pm.ManufacturerId == manufacturerId) > 0) &&
(billingCountryId == 0 || order.BillingAddress.CountryId == billingCountryId);
正如你所看到的,我使用了include()函数里面的连接。那是我卡住的部分。
这是我OrmLite查询:
var q = _erpDbConnection.From<OrderProduct>()
.Join<Order>((x, y) => x.OrderId == y.Id)
.Join<Product>((x, y) => x.ProductId == y.Id)
.Where<OrderProduct>(x => x.ProductId != null && !x.Order.ContainsFreeMaterial && !x.Order.IsFitSizeOrder && x.Order.OrderType != OrderType.Stock)
.And<Order, Product>((o, p) => !o.Deleted && !p.Deleted);
if (storeId > 0)
{
q = q.And<Order>(x => x.StoreId == storeId);
}
if (billingCountryId > 0)
{
q = q.And<Order>(x => x.BillingAddress.CountryId == billingCountryId);
}
if (startDate.HasValue)
{
q = q.And<Order>(x => x.DateCreated <= startDate);
}
if (endDate.HasValue)
{
q = q.And<Order>(x => x.DateCreated >= endDate);
}
if (orderStatusId.HasValue)
{
q = q.And<Order>(x => (int) x.OrderStatus == orderStatusId);
}
if (orderTypeId.HasValue)
{
q = q.And<Order>(x => (int)x.OrderType == orderTypeId);
}
if (paymentStatusId.HasValue)
{
q = q.And<Order>(x => (int)x.PaymentStatus == paymentStatusId);
}
if (shippingStatusId.HasValue)
{
q = q.And<Order>(x => (int)x.ShippingStatus == shippingStatusId);
}
if (categoryId > 0)
{
q = q.And<Product>(x => x.ProductCategories.Any(y => y.CategoryId == categoryId));
}
if (manufacturerId > 0)
{
q = q.And<Product>(product => product.ProductManufacturers.Any(y => y.ManufacturerId == manufacturerId));
}
var filteredOrderProducts = _erpDbConnection.Select<OrderProduct>(q);