簡體   English   中英

將 sql 轉換為 LINQ C#

[英]Converting sql to LINQ C#

我正在使用 LLBLGEN Pro 運行時框架並獲取表的實體。 是否可以將此查詢轉換為 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); 

但它遠非我所需要的。

嘗試這樣的事情

   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; }
    }

您提供損失信息。 也許您想要這樣的關鍵工作: Entity Framework 按照這個鏈接;

此外,我有一個想法來優化使用調用 SQL 查詢命令從表中獲取數據,包括使用 C# 使用不帶實體框架的image數據類型的列,分 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

第一步:新建一個對應上表的類,並創建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 步:使用ParseUser函數從數據庫中獲取Users

    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 步:使用ParseUser函數輕松獲取 Users 類的實例:

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

同樣,您可以創建一個類來使用任何集合(例如List<User>IEnumerable<User>來檢索整個Users 您可以使用 LinQ 查詢這些數據。

感謝 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM