使用linq在查找表中查找记录

时间:2012-08-15 12:22:27

标签: c# linq orm telerik

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

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

Example Database

我希望两个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

刚刚扼杀并创造了这个,我认为应该解释一下

model

4 个答案:

答案 0 :(得分:3)

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

这是使用Any()的常见方案,它转换为sql中的exists。如果您希望example1引用特定的example2(由id指定),请执行以下操作:

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

这为您提供了example1个对象的独特列表,而SelectMany的解决方案可能会生成包含重复项的列表。

答案 1 :(得分:2)

假设

example1-> examplelookup关系名称是examplelookups

example2-> examplelookup关系名称是examplelookups

examplelookup - > example1关系名称是example1

examplelookup - > example2关系名称是example2

给出了example1的id

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

答案 2 :(得分: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 ex1替换为select ex2

答案 3 :(得分:0)

时间很短,但请尝试从查找表开始,以便查询两个关联

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

此处也没有代码检查。