1

我开始掌握 LINQ,并且坚持将查找表实现到对象中然后查询该对象(或它的关联)的基本概念和技术。这可能是一个愚蠢的问题,并且可能有一个我应该自己解决的答案。但我还没有找到使该方法得以坚持的解释。

所以我创建了一个像这样的示例数据库结构

示例数据库

我想进行两个 LINQ 查询,第一个查询为我提供通过查找指定object1相关的所有example2记录,第二个查询为我提供与指定object2相关的所有example1记录

希望外面有人可以启动我的大脑。

就像是

var examples = (from e in db.examples where e.example2.id == id).ToList();

快速编写的 SQL 查询

SELECT * FROM [dbo].[example1] one
JOIN [dbo].[examplelookup] lu ON one.[id] = lu.[example1id]
JOIN [dbo].[example2] two ON lu.[example2id] = two.[id]
WHERE one.[id] = 1

刚刚结束并创建了这个,我认为应该解释一下

模型

4

4 回答 4

3

我知道你接受了一个答案,但只是为了记录:

这是使用的常见场景Any(),它转换为existsin sql。当您希望example1s 引用特定example2(由 指定id)时,请执行以下操作:

from ex1 in example1
where ex1.example2s.Any(e => e.id = id)
select ex1

这为您提供了一个不同的example1对象列表,而SelectMany具有重复项的解决方案可能会产生一个列表。

于 2012-08-15T13:13:50.297 回答
2

假设

example1-> examplelookup 关系名称为 examplelookups

example2-> examplelookup 关系名称为 examplelookups

examplelookup -> example1 关系名称是 example1

examplelookup -> example2 关系名称是 example2

给出id的例子1

db.example1.Where(x=>x.id == id).SelectMany(x=>x.examplelookups).Select(x=>x.example2);

反之亦然

db.example2.Where(x=>x.id == id).SelectMany(x=>x.examplelookups).Select(x=>x.example1);

编辑:基于 Gert Arnold 建议的使用 any 子句的答案的附加更新(这是在已被接受为答案之后)

db.example1.Where(x=>x.examplelookups.Any(y=>y.example2.id == id));

反之亦然

db.example2.Where(x=>x.examplelookups.Any(y=>y.example1.id == id));

第二次编辑(再次在已经接受并回答但在修改问题以包含数据模型之后)

db.Example1.Where(x=>x.Id == id).SelectMany(x=>x.Example2); // could have duplicates
db.Example2.Where(x=>x.Example1.Any(y=>y.Id == id)); //alternate any form removing the duplicates

反之亦然

db.Example2.Where(x=>x.Id == id).SelectMany(x=>x.Example1); // could have duplicates
db.Example1.Where(x=>x.Example2.Any(y=>y.Id == id)); //alternate any form removing the duplicates
于 2012-08-15T12:50:05.500 回答
0

我相信你正在寻找的是加入。此代码将通过连接表为您提供具有相应 example2 记录的所有 example1 记录:

var x = from ex1 in example1
        join exlookup in examplelookup on ex1.id equals exlookup.example1id
        join ex2 in example2 on exlookup.example2id equals ex2.id
        select ex1;

为了得到相反的结果,ex2 记录,只需替换select ex1select ex2.

于 2012-08-15T12:39:57.750 回答
0

时间很短,但尝试从查找表开始,这样您就可以查询两个关联

var examples = (from el in db.examplelookup 
                where el.example2id == id
                select el.examples1.ToList();

这里也没有进行代码检查。

于 2012-08-15T12:50:45.730 回答