我有一个表“a”,带有 id 和时间戳。另一个表“b”有 N 多行引用 id,每行都有“type”和“一些其他数据”。
我希望 LINQ 查询生成一个单行,其中包含 id、时间戳和“一些其他数据”x N。如下所示:
1 | 4671 | 46.5 | 56.5
其中 46.5 来自“b”的一行,56.5 来自另一行;两者具有相同的 id。
我在 SQLite 中有一个有效的查询,但我是 LINQ 的新手。我不知道从哪里开始 - 我认为这根本不是 JOIN。
SELECT
a.id as id,
a.seconds,
COALESCE(
(SELECT b.some_data FROM
b WHERE
b.id=a.id AND b.type=1), '') AS 'data_one',
COALESCE(
(SELECT b.some_data FROM
b WHERE
b.id=a.id AND b.type=2), '') AS 'data_two'
FROM a first
WHERE first.id=1
GROUP BY first.ID
您没有提到您是否使用 Linq to SQL 还是 linq toEntity。但是,以下查询应该可以帮助您:
(from x in a
join y in b on x.id equals y.id
select new{x.id, x.seconds, y.some_data, y.type}).GroupBy(x=>new{x.id,x.seconds}).
Select(x=>new{
id = x.key.id,
seconds = x.Key.seconds,
data_one = x.Where(z=>z.type == 1).Select(g=>g.some_data).FirstOrDefault(),
data_two = x.Where(z=>z.type == 2).Select(g=>g.some_data).FirstOrDefault()
});
显然,您必须在表名称前添加 datacontext 或 Objectcontext 前缀,具体取决于底层提供程序。
您想要做的与旋转类似,请参阅是否可以使用 LINQ 旋转数据?。这里的区别在于,您实际上并不需要聚合(如标准枢轴),因此您需要使用 Max 或一些类似的方法来模拟选择单个 varchar 字段。