如何从多个表中检索可能有也可能没有共同值的数据

时间:2012-02-27 09:26:43

标签: c# linq linq-to-sql

我已经浏览过网络上的任何地方和堆栈溢出但无法找到如何执行任务,如下所示:

var query = (
    from r1 in db.table1
    where r1.Timestamp == date.ToUniversalTime()
    from r2 in db.table2
        .Where(p => p.Timestamp == date.ToUniversalTime())
        .DefaultIfEmpty()
    select new
    {
        prod = r1.Value1,
        prod2 = r2.Value1
    })
    .FirstOrDefault();

这两个表没有相互链接,但我想在一个查询中从两个表中获取数据,这只是一个示例,但实际上我有很多列来获取数据。

道歉,如果这个问题是重复的,但我在搜索时并没有真正找到答案。

在SQL中,我们可以做这样的事情。

Select r1.*,r2.* from table1 r1, table2 r2

如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

这将为您提供(其中db是您的linq数据上下文):

var result= (
        from r1 in db.table1.Where(a=>a.Timestamp==date.ToUniversalTime())
        from r2 in db.table2.Where(a=>a.Timestamp==date.ToUniversalTime())
        select new
        {
            r1,
            r2
        }
    );

这个sql:

Select r1.*,r2.* from table1 r1, table2 r2

答案 1 :(得分:2)

我不确定为什么你的问题标题会说“没有加入”,因为从你的SQL判断你明显想要加入。但无论如何。

我将根据您发布的问题发表评论。您似乎希望为两个表中出现的每个唯一日期值返回一行,对吧?

在这种情况下,我会使用Union

var dates = db.Table1.Select(t => t.Timestamp).Union(
            db.Table2.Select(t => t.Timestamp));

接下来,您可以将每个时间戳转换为包含所有信息的完整行:

var result = dates.Select(date => new
{
    Table1Info = db.Table1.FirstOrDefault(t => t.Timestamp == date),
    Table2Info = db.Table2.FirstOrDefault(t => t.Timestamp == date)
});

请记住,即使您将其写为两个这样的变量,在评估它时它仍然作为单个查询运行(例如,使用foreach)。这使代码更具可读性。

如果这不是您想要的,我建议您编辑问题而不是添加更多评论。现在所有问题实际上都是“LINQ等价于select r1.*, r2.* from table1 r1, table2 r2是什么?”,答案就已经发布了。

相关问题