关于Linq多表连接后并做GridView数据源使用的迷惑,相信很多人都需要明白这个。请熟悉Linq使用的朋友帮帮忙!

tellmethefuture 2009-03-08 01:41:25
我的需求是这样的:
我要关联MENU和FUNCTION两个表,取出一个包含MENU.MENU_ITEM_ID, MENU.MENU_FATHERITEM_ID,FUNCTION.FUNCTION_ID,FUNCTION.FUNCTION_NAME这样一个数据集合。现在用Linq完成,即需要用Linq关联两个表并返回一个混合了来自两个表的所需字段的数据集。

但是发现返回的这个集合没有类型对应。
就是比如说只返回MENU表的数据我可以这么写public List<MENU> GetAllMenuItemslist()
只返回FUNCTION表的数据我可以这么写public List<FUNCTION> GetAllFunctionslist()
所以我自定义了一个类型
public class MenuFuctionInfo
{
public string MenuID;
public string MenuCname;
public string MenuFather;
public string FunctionCode;
public string FunctionDesc;
}


然后用下面的方法返回这个数据集。
public List<MenuFuctionInfo> GetSystemMenuFunctionListByUserName(string user_name)
{
IQueryable<MenuFuctionInfo> item = from menu in dbo.MENU
from function in dbo.FUNCTION
where menu.FUNCTION_ID == function.FUNCTION_ID && menu.IS_ACTIVE == "Y"
orderby menu.ORDER_ID
select new MenuFuctionInfo
{
MenuID = menu.MENU_ID.ToString(),
MenuCname = menu.MENU_CNAME,
MenuFather = menu.MENU_FATHER.ToString(),
FunctionCode = function.FUNCTION_ID,
FunctionDesc = function.FUNCTION_NAME
};
return item.ToList();

}

问题来了,这个List没有办法做比如说GridView的DataSource,我这知道这个事肯定不能的,但是我怎么做才能组织一个能做DataSource的类型呢?好像在数据库建视图可以,但是不想把所有这种关联多表查询都做成视图,感觉有点傻。
简言之就是如何用Linq技术把返回的List做为GridView的数据源实现以前SQL关联多表查询,返回一个DataTable做GridView的过程。
希望高手解答! 小弟刚刚开始尝试Linq.谢谢!
...全文
1124 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ635521127 2010-06-29
  • 打赏
  • 举报
回复
我要学习

yuxuehui 2009-04-21
  • 打赏
  • 举报
回复
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataClassesDataContext dc = new DataClassesDataContext();
var sel = from c in dc.T_User select c;
foreach (var c in sel)
{
Label1.Text += c.UserName + "<br />";
}
}
}
public List<UserFuctionInfo> Getlist()
{
DataClassesDataContext dc = new DataClassesDataContext();
IQueryable<UserFuctionInfo> item = from u in dc.T_User
from g in dc.T_UserGrpRight
where u.UserID.Equals(g.UserID)
orderby u.UserID
select new UserFuctionInfo
{
UserCode = u.UserCode,
UserID = g.UserID,
UGrpCode = g.UGrpCode,
UserName = u.UserName
};
return item.ToList();

}
protected void Button1_Click(object sender, EventArgs e)
{
GridView1.DataSource = Getlist() ;
GridView1.DataBind();

}
}
public class UserFuctionInfo
{
public string UserName { get; set; }
public string UserCode { get; set; }
public int UGrpCode { get; set; }
public int UserID { get; set; }
}
tellmethefuture 2009-03-08
  • 打赏
  • 举报
回复
貌似沉了, 顶一下 谢谢啦
tellmethefuture 2009-03-08
  • 打赏
  • 举报
回复
好了 哈哈!

不过现在还有一点没解决,搞定就结帐了哈!
在往RadMenu树型菜单, 有个DataFieldParentIDDataFieldID的设置不管用了。RadMenu不能正常接收父子关系的设定并生成层级树菜单了

以前那里是写字段名的,现在是这样写么? 应该怎么写呢?

<radP:RadPanelbar ID="RadMenu" runat="server" Skin="SiteFinity"
DataFieldID="MenuID" DataFieldParentID="MenuFather"
Height="600px" Width="160px" OnItemDataBound="RadMenu_ItemDataBound"
>
</radP:RadPanelbar>



RadMenu.DataSource = auth.GetSystemMenuFunctionListByUserName(this.SessionUserName);//List<MenuFuctionInfo>
RadMenu.DataBind();
liuyeede 2009-03-08
  • 打赏
  • 举报
回复
只要实现了IEnumrable<T>接口就扣的对象都可以作为数据绑定控件的数据源。其中IQueryable<T>也实现了IEnumrable<T>接口。
tellmethefuture 2009-03-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyq11 的回复:]
通过LINQ查询,直接绑定就可
http://www.cnblogs.com/lyj/archive/2009/02/16/1051495.html
http://blog.csdn.net/heker2007/archive/2007/12/19/1952944.aspx
[/Quote]

返回数据集是逻辑层封装好的方法,必须要搞个类型
liuyeede 2009-03-08
  • 打赏
  • 举报
回复
List可以作为GridView的数据源。我经常用。
另外你的实体类写成这样:

public class MenuFuctionInfo
{
public string MenuID{get;set;};
public string MenuCname{get;set;};
public string MenuFather{get;set;};
public string FunctionCode{get;set;};
public string FunctionDesc{get;set;};
}
maddemon 2009-03-08
  • 打赏
  • 举报
回复
public class MenuFuctionInfo
{
public string MenuID{get;set;}
public string MenuCname{get;set;}
public string MenuFather{get;set;}
public string FunctionCode{get;set;}
public string FunctionDesc{get;set;}
}
tellmethefuture 2009-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunshine_anycall 的回复:]
改成这样试试

C# code
public class MenuFuctionInfo
{
private string _munuId = string.Empty;
public string MenuID
{
get { return _munuId; }
set { _munuId = value; }
}

private string _MenuCname = string.Empty;
public string MenuCname
{
get { return _MenuCname; }
set { _MenuCname = value; }
}

//...
[/Quote]


一样的 也是返回这个错误:

Server Error in '/TestSystem' Application.
--------------------------------------------------------------------------------

The data source for GridView with id 'GridView1' did not have any properties or attributes from which to generate columns. Ensure that your data source has content.
maddemon 2009-03-08
  • 打赏
  • 举报
回复
楼上给出答案,请用属性。


如果你的数据库有建关系的话 可以不用关联查询
而是直接from menu in dbo.MENU where menu.IS_ACTIVE == "Y" orderby menu.ORDER_ID select menu
绑定的时候可以直接这样写
<%#Eval("MENU.FUNCTION_NAME")%>
tellmethefuture 2009-03-08
  • 打赏
  • 举报
回复
To:sunshine_anycall
咦?~~

这个会与支不支持做DataSoure有关么?我试试
sunshine_anycall 2009-03-08
  • 打赏
  • 举报
回复
改成这样试试

public class MenuFuctionInfo
{
private string _munuId = string.Empty;
public string MenuID
{
get { return _munuId; }
set { _munuId = value; }
}

private string _MenuCname = string.Empty;
public string MenuCname
{
get { return _MenuCname; }
set { _MenuCname = value; }
}

//...

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧