需要另一种方法来进行 SQL 到 LINQ 的转换

Need a alternate approch to do SQL to LINQ conversion

我正在尝试为我的视图获取特定的结果集以进行绑定。我是 Linq 表达式的新手,所以我不太确定不同的实现方式。

这是我的 MenuModel

public class MenuModel : DisposeBase
    {
        public string ParentID { get; set; }
        public string ParentName { get; set; }
        public List<MenuItemModel> MenuItems { get; set; }
    }

我的MenuItemModel

public class MenuItemModel : DisposeBase
    {
        public string ChildID { get; set; }
        public string ChildName { get; set; }
        public string PageURL { get; set; }
    }

MenuModel 是我期望作为结果集的输出类型。我从后端

得到类型 DataTable 的结果集
DataTable dtable = oDatabase.ExecuteAdapter(System.Data.CommandType.StoredProcedure, "SP_GETUSERNAVMENUDATA");

这是我的 SQL 结果集,

My DataTable will looks like this

现在我需要将此数据表转换为 MenuModel 类型。

我尝试查询不同的 MenuModel 并基于此构建 MenuItemModel 对象。

List<MenuModel> lstMenuModel = dtable.DataTableToList<MenuModel>()
                                            .GroupBy(p => new { p.ParentID, p.ParentName })
                                            .Select(g => g.First())
                                            .ToList<MenuModel>();

            foreach (MenuModel parentItem in lstMenuModel)
            {
                List<MenuItemModel> lstUserMenuItemData = dtable.DataTableToList<MenuItemModel>()
                                                .Select(i => new { i.ChildID, i.ChildName, i.PageURL, i.ParentID })
                                                .Where(i => i.ParentID.Equals(parentItem.ParentID))
                                                .ToList<MenuItemModel>();
            }

但是我在构建 MenuItemModel 时仍然遇到转换错误。现在我想知道,是否有任何最佳实践可以对这些嵌套 class 类型进行相同的转换?我相信这样做应该很简单。

如有任何帮助,我们将不胜感激。谢谢!

注意:DataTableToList 是一种将 DataTable 对象转换为特定通用类型的方法

不清楚您的 DataTableToList<MenuModel>() 方法在做什么或 returning,但它需要 return 包含数据中表示的所有 5 个属性的模型集合table.

假设您有以下模型

public class MenuSQLSet
{
    public string ParentID { get; set; }
    public string ParentName { get; set; }
    public string ChildID { get; set; }
    public string ChildName { get; set; }
    public string PageURL { get; set; }
}

那么您的查询应该是

List<MenuModel> lstMenuModel = dtable.DataTableToList<MenuSQLSet>()
    .GroupBy(x => new { x.ParentID, x.ParentName })
    .Select(x => new MenuModel()
    {
        ParentID = x.Key.ParentID,
        ParentName = x.Key.ParentName,
        MenuItems = x.Select(y => new MenuItemModel()
        {
            ChildID = y.ChildID,
            ChildName = y.ChildName,
            PageURL = y.PageURL
        }).ToList()
    }).ToList();

或者您可以在 DataTable 上使用 .AsEnumerable() 并引用列名称

List<MenuModel> lstMenuModel = dtable.AsEnumerable()
    .GroupBy(x => new { ParentID = x["ParentID"], ParentName = x["ParentName"] })
    .Select(x => new MenuModel()
    {
        ParentID = x.Key.ParentID,
        ParentName = x.Key.ParentName,
        MenuItems = x.Select(y => new MenuItemModel()
        {
            ChildID = y["ChildID"],
            ....