使用JOIN与Linq到SQL ExecuteQuery问题

时间:2012-06-06 19:13:39

标签: asp.net sql linq-to-sql

我已经在我的一个网站上使用Linq to SQL一段时间了,随着时间的推移,我用来查询数据库的代码变得有点乱,所以我决定重写,原来我的查询都处理完了完全由Linq提供,但最近一直需要更高级的搜索功能,这使我更倾向于使用ExecuteQuery和手写我的SQL语句,问题是我不能为我的生活让Join语句正常工作。

我的数据库中有两个表,t_events和t_clients。两个表之间唯一相似的是它们都有一个clientid字段(事件所针对的客户端的id)。我需要做的是将所有事件都拉到页面中(工作正常)但我不想在页面上显示我需要显示客户端名称的clientid。最初我有一个很好地处理这个问题的连接子句:

   var eve = from p in db.t_events
                          join c in db.Clients on p.clientid equals c.clientid
                          where p.datedue <= thisDay && p.status != "complete"
                          select new { p.eventname, p.datedue, p.details, p.eventid,         p.status, c.clientname };

随着页面的重新设计,我遇到了重新创建linq在这里使用连接所做的事情的问题。我目前的代码:

  StringBuilder sqlQuery = new StringBuilder("SELECT * FROM dbo.t_events JOIN dbo.t_clients ON dbo.t_events.clientid=dbo.t_clients.clientid");
    var query = db.ExecuteQuery<t_events>(sqlQuery.ToString());
    foreach (var c in query)
    {       
            counter = counter + 1;
            MyStringBuilder.Append("<tr class='"+c.status+"'><td><a href='searchdetails.aspx?id="+c.eventid+"'>"+c.eventname+"</a></td><td>" +c.clientname+ "</td></tr>");
    }

在foreach循环中我可以看到我试图引入c.clientname(这不起作用),因为它不在t_events数据库上,将其更改为c.clientid使代码工作,我不确定问题是,采用相同的SQL并直接从sql管理工具运行查询就像魅力一样。关于这个问题的任何想法将不胜感激!

固定!

DaveMarkle建议使用一个视图,这是迄今为止更简单的方法。我创建了一个视图,将两个表连接到我需要的字段并对其进行查询,简单有效,谢谢!

2 个答案:

答案 0 :(得分:1)

嗯 - 所以也许我们应该在这里找到答案,所以这个问题会从'未答复'列表中删除。

正如Dave Markle所说。

使用视图。

答案 1 :(得分:0)

另一个选择!

执行两次查询:一次是使用db.ExecuteQuery << strong> t_events >,一次是db.ExecuteQuery << strong> t_clients >。现在您同时拥有事件和客户端,您可以通过匹配client_id在客户端将它们重新加入。