C# 需要另一种方法来进行SQL到LINQ的转换吗
我正在尝试为视图绑定一个特定的结果集。我是Linq expression的新手,所以我不太确定使用不同的方法 这是我的C# 需要另一种方法来进行SQL到LINQ的转换吗,c#,linq,asp.net-mvc-3,C#,Linq,Asp.net Mvc 3,我正在尝试为视图绑定一个特定的结果集。我是Linq expression的新手,所以我不太确定使用不同的方法 这是我的MenuModel public class MenuModel : DisposeBase { public string ParentID { get; set; } public string ParentName { get; set; } public List<MenuItemModel> MenuI
MenuModel
public class MenuModel : DisposeBase
{
public string ParentID { get; set; }
public string ParentName { get; set; }
public List<MenuItemModel> MenuItems { get; set; }
}
MenuModel
是我期望作为结果集的输出类型。我正在从后端获取类型为DataTable
的结果集
DataTable dtable = oDatabase.ExecuteAdapter(System.Data.CommandType.StoredProcedure, "SP_GETUSERNAVMENUDATA");
这是我的SQL结果集
现在我需要将这个数据表转换为类型MenuModel
我试图查询distinctMenuModel
并以此为基础构建menuitemodel
对象
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>();
}
List lstMenuModel=dtable.DataTableToList()
.GroupBy(p=>new{p.ParentID,p.ParentName})
.Select(g=>g.First())
.ToList();
foreach(lstMenuModel中的MenuModel父项)
{
列表lstUserMenuItemData=dtable.DataTableToList()
.Select(i=>new{i.ChildID,i.ChildName,i.PageURL,i.ParentID})
其中(i=>i.ParentID.Equals(parentItem.ParentID))
.ToList();
}
但在构建menuitemodel
时,仍然会出现转换错误。现在我想知道,对这些嵌套的类类型进行同样的转换有什么最佳实践吗?我相信应该有一些简单的方法来做到这一点
任何帮助都将不胜感激。谢谢
注意:DataTableToList是一种将DataTable对象转换为特定泛型类型的方法不清楚您的
DataTableToList()
方法正在执行或返回什么,但它需要返回包含数据表中表示的所有5个属性的模型集合
假设您有以下模型
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();
PARENTID和CHILDID中的值是什么意思?什么是
DataTableToList()
?为了生成所需的模型,该方法需要投影到一个包含所有5个属性的模型中。parentId是父菜单的ID,CHILDID是特定父菜单中子菜单的ID@MarkoJuvančič我已经更新了我的问题,请在我问题的末尾找到注释。如果我创建了一个包含所有5个属性的类,那么最终可能会复制这些属性。单个父对象可以有多个子对象。我想以我提到的相同方式维护模型关系@StephenMuecke@KarthickJayaraman,您必须首先将所有5个属性投影到一个模型中,并对其进行分组(或在数据表上使用.AsEnumerable()
,并引用有点难看的列名)-您不会以重复作为旁注,究竟为什么要将SP返回的数据转换为DataTable,然后再将DataTable转换为模型。这是我今年看到的第二个仍然使用数据表的MVC问题-我以为你们都灭绝了:)-你应该使用DataReader
直接读取模型集合。
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();
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"],
....