Преобразование sql в LINQ C# - PullRequest
0 голосов
/ 06 января 2020

Я использую LLBLGEN Pro Runtime Framwork и получаю объект таблицы. Можно ли преобразовать этот запрос в выражение LINQ?

SELECT s1.SETTING_NAME, s1.SETTING_VALUE, s1.ROW_LST_UPD_TS, s1.MACHINE_NAME, s1.ROW_LST_UPD_UID
FROM EVENT_MGT.CONFIGURATION_LOG s1
INNER JOIN (
    SELECT SETTING_NAME, MAX(ROW_LST_UPD_TS) ROW_LST_UPD_TS
    FROM EVENT_MGT.CONFIGURATION_LOG
    WHERE APP_ID = 173
--    and ROW_LST_UPD_TS >= CURRENT_TIMESTAMP - 7
    GROUP BY SETTING_NAME
) s2 ON s1.SETTING_NAME = s2.SETTING_NAME AND s1.ROW_LST_UPD_TS = s2.ROW_LST_UPD_TS
WHERE s1.APP_ID = 173;

Я до сих пор пробовал это:

var log1 = config_log.Where(app => app.AppId == 173)
                     .Select(s => new {
                          s.SettingName, 
                          s.SettingValue, 
                          s.RowLstUpdTs, 
                          s.MachineName, 
                          s.RowLstUpdUid})
                     .ToList()
                     .GroupBy(x => x.SettingName); 

Но это далеко от того, что мне нужно.

Ответы [ 3 ]

2 голосов
/ 06 января 2020

Попробуйте что-то вроде этого

   class Program
    {

        static void Main(string[] args)
        {
            int CURRENT_TIMESTAMP = 123;

            List<CONFIGURATION_LOG> logs = new List<CONFIGURATION_LOG>();
            var results = logs.Where(x => (x.APP_ID == 173) && (x.ROW_LST_UPD_TS >= CURRENT_TIMESTAMP - 7))
                .OrderByDescending(x => x.ROW_LST_UPD_TS)
                .GroupBy(x => x.SETTING_NAME)
                .Select(x => x.FirstOrDefault())
                .Select(x => new
                {
                    setting_name = x.SETTING_NAME,
                    setting_value = x.SETTING_VALUE,
                    row_lst_upd_ts = x.ROW_LST_UPD_TS,
                    machine_name = x.MACHINE_NAME,
                    row_lst_upd_uid = x.ROW_LST_UPD_UID
                }).ToList();

        }
    }
    public class EVENT_MGT
    {
        CONFIGURATION_LOG CONFIGURATION_LOG { get; set; } 
    }
    public class CONFIGURATION_LOG
    {
        public string SETTING_NAME { get; set; }
        public string SETTING_VALUE { get; set; }
        public int ROW_LST_UPD_TS { get; set; }
        public string MACHINE_NAME { get; set; }
        public string ROW_LST_UPD_UID { get; set; }
        public int APP_ID { get; set; }
    }
1 голос
/ 06 января 2020

Вы предоставляете информацию о потерях. Может быть, вы хотите одну вещь, такую ​​как эта клавиатура: Entity Framework. Перейдите по этой ссылке ;

Кроме того, у меня есть идея оптимизировать использование команды запроса call SQL, чтобы получить данные из таблицы, включающей столбцы с типом данных image с использованием C# без Entity Framework в 3 шага с небольшим примером:

Шаг 0 : (по умолчанию) Создать новую таблицу. Это моя таблица TBUsers:

CREATE TABLE [dbo].[TBUsers]
(
    [STT] [BIGINT] IDENTITY(1,1) NOT NULL,
    [HoTen] [NVARCHAR](MAX) NOT NULL,
    [MaSo] [NVARCHAR](50) NOT NULL,
    [MatKhau] [NVARCHAR](MAX) NOT NULL,
    [KhoaLop] [NVARCHAR](MAX) NOT NULL,
    [MaTheGui] [NVARCHAR](50) NOT NULL,
    [PhanQuyen] [INT] NOT NULL,
    [ChoPhepHoatDong] [BIT] NOT NULL,
    [NguoiThem] [NVARCHAR](MAX) NOT NULL,
    [NgayThem] [DATETIME] NOT NULL,
    [SoDuKhaDung] [BIGINT] NOT NULL,
    [DangGui] [BIT] NOT NULL,
    [TruyCapLanCuoi] [DATETIME] NULL,
    [ThoiGianGuiCuoi] [DATETIME] NULL,
    [HinhAnh] [IMAGE] NULL,
    [DonGia] [BIGINT] NULL,

    CONSTRAINT [PK_TBUsers] 
        PRIMARY KEY CLUSTERED ([MaTheGui] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Шаг 1: создайте новый класс, соответствующий таблице выше, и создайте 2 конструктора, Users:

    public class Users
    {
        public Users()
        { }

        public Users(object sTT, object hoTen, object maSo, object matKhau, object khoaLop, object maTheGui, object phanQuyen, object choPhepHoatDong,
            object nguoiThem, object ngayThem, object soDuKhaDung, object dangGui, object truyCapLanCuoi, object thoiGianGuiCuoi, object hinhAnh,object donGia)
        {
            STT = sTT.ToString();
            HoTen = hoTen.ToString();
            MaSo = maSo.ToString();
            MatKhau = matKhau.ToString();
            KhoaLop = khoaLop.ToString();
            MaTheGui = maTheGui.ToString();
            PhanQuyen = phanQuyen.ToString();
            ChoPhepHoatDong = choPhepHoatDong.ToString();
            NguoiThem = nguoiThem.ToString();
            NgayThem = ngayThem.ToString();
            SoDuKhaDung = soDuKhaDung.ToString();
            DangGui = dangGui.ToString();
            TruyCapLanCuoi = truyCapLanCuoi.ToString();
            ThoiGianGuiCuoi = thoiGianGuiCuoi.ToString();

            HinhAnh = hinhAnh==System.DBNull.Value?null: (byte[])hinhAnh;
            DonGia = donGia.ToString();
            Color = (bool)choPhepHoatDong;
        }

        public string STT { get; set; }
        public string HoTen { get; set; }
        public string MaSo { get; set; }
        public string MatKhau { get; set; }
        public string KhoaLop { get; set; }
        public string MaTheGui { get; set; }
        public string PhanQuyen { get; set; }
        public string ChoPhepHoatDong { get; set; }
        public string NguoiThem { get; set; }
        public string NgayThem { get; set; }
        public string SoDuKhaDung { get; set; }
        public string DangGui { get; set; }
        public string TruyCapLanCuoi { get; set; }
        public string ThoiGianGuiCuoi { get; set; }
        public byte[] HinhAnh { get; set; }
        public string DonGia { get; set; }
        public bool Color { get; set; }
    }
}

Шаг 2: Получить Users из базы данных с функцией ParseUser:

    public static Users ParseUser(DataRow row)
    {
        var stt = row["STT"];
        var hoTen = row["HoTen"];
        var maSo = row["MaSo"];
        var matKhau = row["MatKhau"];
        var khoaLop = row["KhoaLop"];
        var maTheGui = row["MaTheGui"];
        var phanQuyen = row["PhanQuyen"];
        var choPhepHoatDong = row["ChoPhepHoatDong"];
        var nguoiThem = row["ChoPhepHoatDong"];
        var ngayThem = row["ChoPhepHoatDong"];
        var soDuKhaDung = row["SoDuKhaDung"];
        var dangGui = row["DangGui"];
        var truyCapLanCuoi = row["TruyCapLanCuoi"];
        var guiLanCuoi = row["ThoiGianGuiCuoi"];
        var hinhAnh = row["HinhAnh"] == System.DBNull.Value ? null : row["HinhAnh"];
        var donGia = row["DonGia"];

        return new Users(stt, hoTen, maSo, matKhau, khoaLop, maTheGui, phanQuyen, choPhepHoatDong, nguoiThem, ngayThem, soDuKhaDung, dangGui,
            truyCapLanCuoi, guiLanCuoi, hinhAnh, donGia);
    }

Шаг 3: Легко взять экземпляр Users класс с функцией ParseUser:

Users user = ParseUser(sqlUtility.GetDataTable($"SELECT * FROM [dbo].[TBUsers] WHERE MaSo = 'xxx' AND ChoPhepHoatDong=1;").Rows[0]);

Аналогично, вы можете создать класс для извлечения всего Users, используя любую коллекцию, такую ​​как List<User> или IEnumerable<User>. Вы можете использовать LinQ для запроса этих данных.

0 голосов
/ 06 января 2020

Благодаря jdweng я понял, как получить именно то, что мне нужно:

var results = config_log.Where(x => x.AppId == 173)
                                    .OrderByDescending(x => x.RowLstUpdTs).ToList()
                                    .GroupBy(x => x.SettingName )
                                    .Select(x => new
                                    { 
                                        setting_name = x.Select(y => y.SettingName).FirstOrDefault(),
                                        setting_value = x.Select(y => y.SettingValue).FirstOrDefault(),
                                        row_lst_upd_ts = x.Select(y => y.RowLstUpdTs).FirstOrDefault(),
                                        machine_name =  x.Select(y => y.MachineName).FirstOrDefault(),
                                        row_lst_upd_uid = x.Select(y => y.RowLstUpdUid).FirstOrDefault()
                                    }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...