Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 林奇;“在哪里?”;用于筛选数据的子查询_Linq - Fatal编程技术网

Linq 林奇;“在哪里?”;用于筛选数据的子查询

Linq 林奇;“在哪里?”;用于筛选数据的子查询,linq,Linq,我想使用Linq to实体查询sql server数据库。我想使用以下Sql查询对下表过滤结果: 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) N

我想使用Linq to实体查询sql server数据库。我想使用以下Sql查询对下表过滤结果:

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
);
需要注意的是,至少会有一排董事会成员。可以有零到多个共享行。我想返回单板行,以及链接了共享行的任何其他板行

我已经使用GroupJoin、SelectMany和DefaultIfEmpty执行了查询,试图执行等效的TSQL外部连接,但所有这些看起来都比TSQL等效连接复杂得多


如何在Linq中执行等效操作以过滤结果,从而使其使用“Where in”SQL语句和OR子句来处理父表中的数据?

您可以执行以下操作:

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;
或者,您可以尝试创建一个名为where的扩展方法来自动执行此操作:

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;
    }
}
见:可能重复的
var selection = boards.WhereIn(from s in shares
                               where s.userid == p0
                               select s.boardid, b => b.id);