我想使用Linq to Entities查询sql server数据库。我想使用以下Sql Query对以下表格过滤结果:
DECLARE p0...
SELECT * FROM Boards b
WHERE b.ownerid = p0 or
b.id IN (SELECT s.boardid FROM Shares s WHERE s.userid = p0)
CREATE TABLE [dbo].[Boards] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[OwnerId] NVARCHAR (128) NULL,
[ShortName] NVARCHAR (50) NULL,
...);
CREATE TABLE [dbo].[Shares] (
[BoardId] INT NOT NULL,
[UserId] NVARCHAR (128) NOT NULL
);
一些警告,至少会有一个董事会行。可以有零到多个共享行。我想返回一个Board行,以及已链接Share行的任何其他Board行。
我已经使用GroupJoin,SelectMany和DefaultIfEmpty执行了查询,以便执行等效的TSQL外连接,但所有这些看起来都比TSql等效更复杂。
如何在Linq中执行等效操作以过滤结果,以便它使用“Where In”SQL语句和包含父表中数据的OR子句?
答案 0 :(得分:0)
您可以执行以下操作:
var selection = from b in boards
where b.ownerid == p0 ||
(from s in shares
where s.userid == p0
select s.boardid).Contains(b.id)
select b;
或者,您可以尝试创建一个名为WhereIn的扩展方法来自动执行此操作:
public static class WhereInExtension
{
public static IEnumerable<T1> WhereIn<T1, T2>(this IEnumerable<T1> table, IEnumerable<T2> container, Func<T1, T2> converter)
{
return from b in table
where container.Contains(converter(b))
select b;
}
}
然后将使用以下命令调用查询(没有b.ownerid == p0
要求)
var selection = boards.WhereIn(from s in shares
where s.userid == p0
select s.boardid, b => b.id);