Конвертировать SQL запрос в LINQ - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть такой объект:

public partial class Invoice
{
        public string DocumentNumber { get; set; }
        public DateTime? DocumentDate { get; set; }
        public string DocumentReference { get; set; }
        public string SerialNumber { get; set; }
        public string ProductCode { get; set; }
        public string Description { get; set; }
        public string Certificate { get; set; }
        public string Email { get; set; }
        public string Language { get; set; }
}

У меня также есть запрос к базе данных SQL (таблица вышеуказанных объектов), который возвращает некоторые результаты:

SELECT 
    DocumentNumber, DocumentDate, DocumentReference,
    SerialNumber, ProductCode, Description, Certificate
FROM 
    vInvoice
WHERE 
    CHECKSUM(DocumentNumber + DocumentReference + CAST(DocumentDate AS VARCHAR)) 
        IN (SELECT CHECKSUM(DocumentNumber + DocumentReference + CAST(DocumentDate AS VARCHAR))
            FROM vInvoice
            WHERE Email = 'somemail@gmail.com' AND Language = 'FR'
            GROUP BY DocumentNumber, DocumentDate, DocumentReference
            ORDER BY DocumentDate 
                OFFSET 0 ROWS
                FETCH NEXT 4 ROWS ONLY)

Могу ли я написать запрос LINQ, идентичный приведенному выше SQL утверждению?

1 Ответ

0 голосов
/ 07 февраля 2020

Хорошо, поэтому в этой ситуации я бы поместил представление в DBML или EDMX, а затем использовал linq в функции для создания списка соответствующих счетов-фактур. Сам код довольно прост, но, глядя на ваш запрос, я должен спросить: какова цель CHECKSUM?

Мне кажется, что вы просто получаете все счета, которые соответствуют электронной почте и язык и может просто иметь ваш запрос:

SELECT TOP 4
    [DocumentNumber], 
    [DocumentDate], 
    [DocumentReference],
    [SerialNumber], 
    [ProductCode], 
    [Description], 
    [Certificate]
FROM 
    [vInvoice]
WHERE [Email] = 'somemail@gmail.com' AND [Language] = 'FR'
GROUP BY [DocumentNumber], [DocumentDate], [DocumentReference]
ORDER BY [DocumentDate] 

То, что я бы сделал для функции C#, выглядит примерно так:

public IList<Invoice> GetInvoices(string email, string language)
{
    Using (EntityContext context = new EntityContext(ConnectionStrings.Connection))
    {
        IList<Invoice> results;
        results = context.vInvoices
            .Where(x => x.Email == email && x.Language == language)
            .Select(x => new Invoice
            {
                DocumentNumber = x.DocumentNumber, 
                DocumentDate = x.DocumentDate, 
                DocumentReference = x.DocumentReference,
                SerialNumber = x.SerialNumber, 
                ProductCode = x.ProductCode, 
                Description = x.Description, 
                Certificate = x.Certificate,
                Email = x.Email,
                Language = x.Language
            })
            .OrderBy(x => x.DocumentDate)
            .ToList();

        return results;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...