Linq“Where In”子查询过滤数据

时间:2015-02-24 13:56:59

标签: linq

我想使用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子句?

1 个答案:

答案 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);