Эта вещь EF не кажется легким для меня как новичком :( У меня есть SQL, который дает 20 записей:
SELECT
Suppliers.SupplierName,
srma.Id,
srma.CreatedOn,
srmaStatuses.StatusName,
srma.Status,
srma.PONumber,
srma.PONumber,
PurchaseOrders.PODate,
PurchaseOrders.suppliersOrderNumber
FROM
SRMAs srma
join srmastatuses on srma.status = srmastatuses.id
JOIN PurchaseOrders on SRMA.PONumber = PurchaseOrders.PONumber
JOIN Suppliers on Suppliers.SupplierID = PurchaseOrders.SupplierID
WHERE
srma.Status in (0,1)
AND(PurchaseOrders.suppliersOrderNumber LIKE '%2002%' OR srma.PONumber = '2002')
Я сделал следующую версию LINQ, которая не возвращает никакой записи:
var searchQuery = collection["query"].Trim();
DBContext_Model db = new DBContext_Model();
int[] ids = new int[] { 0, 1 };
//LINQ way to JOIN tables
var srmas = (
from SRMAs in db.SRMAs
join SRMAStatus in db.SRMAStatus on SRMAs.Id equals SRMAStatus.Id
join PurchaseOrders in db.PurchaseOrders on SRMAs.PONumber equals PurchaseOrders.PONumber
join Suppliers in db.Suppliers on PurchaseOrders.SupplierID equals Suppliers.SupplierID
join SRMADetails in db.SRMADetails on SRMAs.Id equals SRMADetails.SRMAId
where
(
ids.Contains(SRMAs.Status)
&&
(
searchQuery.Contains(PurchaseOrders.suppliersOrderNumber)
||
searchQuery.Contains(SqlFunctions.StringConvert((decimal)SRMAs.PONumber))
)
)
select new
{
SRMAs.Status,SRMAs.Id,
SRMAs.PONumber,
SRMAs.CreatedOn,
Suppliers.SupplierName,
SRMAStatus.StatusName,
PurchaseOrders.PODate,
PurchaseOrders.suppliersOrderNumber
}).ToList();
Если я удалю эту часть, она вернет только 4 записи, хотя она должна сделать 20.
&&
(
searchQuery.Contains(PurchaseOrders.suppliersOrderNumber)
||
searchQuery.Contains(SqlFunctions.StringConvert((decimal)SRMAs.PONumber))
)
Возможно ли использовать LINQ, а не испортить мне жизнь?
1. Предложение on
должно сравнивать FK с PK, вы сравнивали PK с PK при присоединении к SRMA
с SRMAStatus
. Изменение SRMAs.Id equals SRMAStatus.Id
для SRMAs.StatusId equals SRMAStatus.Id
.
2. Удалите эту часть, join SRMADetails in db.SRMADetails on SRMAs.Id equals SRMADetails.SRMAId
поскольку sql-запрос не имеет условия соединения в SRMADetails.
3. И поисковый запрос, который у вас был в данный момент, будет генерировать что-то вроде:
CAST(CHARINDEX(PurchaseOrders.suppliersOrderNumber, '2002') AS int) > 0
or
CAST(CHARINDEX(cast(SRMAs.PONumber as varchar(max)), '2002') AS int) > 0
Где это должно быть:
PurchaseOrders.suppliersOrderNumber.Contains(searchQuery)
||
SqlFunctions.StringConvert((decimal)SRMAs.PONumber).Contains(searchQuery)
Так что он генерирует что-то вроде:
PurchaseOrders.suppliersOrderNumber LIKE '%2002%'
||
srma.PONumber LIKE '%2002%'
SRMAs.Id equals SRMAStatus.Id
, не должно ли это бытьSRMAs.StatusId equals SRMAStatus.Id
?