2009-12-21 49 views
0

我有两个表tblActionLogtblLoginLogLINQ to SQL:来自两个不相关表的数据,日期排序

这是tblActionLog

tblActionLog 
------------ 
ID (int) 
Happened (DateTime) 
...etc. 

这是tblLoginLog

tblLoginLog 
----------- 
ID (int) 
LoginDate (DateTime) 
...etc. 

现在我想和信息GridView从这两个表中海誓山盟交错,使他们独立日的信息是排序,例如:

LOG OF STUFF 
------------------------------- 
DATE  | WHAT  
2009-09-09 | Anderson logged in. 
2009-09-08 | Smith made an action. 
2009-09-08 | Smith logged in. 
2009-09-06 | Anna made an action. 
2009-09-04 | Smith made an action. 

我希望这已经足够清楚。我想要在单个LINQ查询中获得所有这些信息(不一定是一个SQL查询)。任何帮助赞赏。

回答

0

您可能想要使用Select()和Union()来整理结果。

var query = context.Logins.Where(l => l.UserID == userID) 
          .Select(l => new { Date = l.Date, What = "logged in" }) 
        .Union(context.Actions.Where(a => a.UserID == userID) 
              .Select(a => new { Date = a.Date, What = a.Action })) 
        .OrderBy(r => r.Date); 

注意:您可能需要兑现每一个子查询(使用ToList()或AsEnumerable()),但我认为应该LINQ2SQL能够直接构建UNION。此外,这是完全未经测试 - 直接输入答案编辑器,我没有检查联盟方法的签名,因此您可能需要进行调整。

+0

你可以给我一个使用我的表的例子,如问题所示?谢谢。 – 2009-12-21 14:42:00

+0

哪个更好,Union还是Concat? – 2009-12-21 14:48:21

+0

其实我认为翻译的唯一区别在于它是否做了UNION或UNION ALL。在这种情况下,它相当于同样的事情,但如果你可以容忍重复(或者没有 - 这可能是这种情况),Concat可能会更快一些。 – tvanfosson 2009-12-21 15:29:01

1

这里是做的另一种方式....

(from a in dataContext.tblActionLog 
select new 
{ 
    Date = a.Date, 
    What = a.WhatHappened 
}).Union 
     (from l in dataContext.tblLoginLog 
     select new 
     { 
      Date = l.Date, 
      What = l.WhatHappened 
     }).OrderByDescending(c => c.Date); 

当然,你会替换你的DataContext对象的实际名称和列的实际名称以示发生了什么(因为未列在您的餐桌设计中)。