Где пункт в Entity Framework не возвращает правильный результат

1

Эта вещь 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, а не испортить мне жизнь?

  • 5
    эта часть SRMAs.Id equals SRMAStatus.Id , не должно ли это быть SRMAs.StatusId equals SRMAStatus.Id ?
  • 0
    Мне неловко, да :(
Показать ещё 5 комментариев
Теги:
linq
entity-framework

1 ответ

1
Лучший ответ

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%'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню