Linq在单个字段上连接2个实体并返回匹配的条目

时间:2015-09-04 09:55:16

标签: c# entity-framework linq

我正在使用忘记了外键的数据库,我无法修改它。

我的想法是使用Linq查询“跟随”这个外键,我设法做的是:

MY_ENTITY_CONTEXT ctx = new MY_ENTITY_CONTEXT();
List<MY_ENTITY_OBJ1> objs1 = ctx.OBJ1.Where(mycondition).ToList();
List<MY_ENTITY_OBJ2> objs2 = ctx.OBJ2.Where(x=>x.objs1.Select(o=>o.FieldToJoin).ToList().Contains(x.FieldJoined)).ToList();

但是,我确信这不是最好的方法,我确信有更好的操作员,但我找不到哪一个。我想使用.Join()但对我来说,就像在SQL中一样,它用于在属性上交叉的两个表的合成表示。

您知道哪种运营商最适合我的情况吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以编写常规连接语句:

from o1 in ctx.OBJ1
join o2 in ctx.OBJ2 on o1.FieldToJoin equals o2.FieldJoined
where o1 == <mycondition>
select o2

当数据库中没有外键时,您甚至可以定义实体之间的关联。唯一的要求是一个实体引用另一个实体的主键(更确切地说:EF所知的主键)。所以你可以定义一个导航属性,如OBJ1.OBJ2s

答案 1 :(得分:0)

尝试这些解决方案

这将搜索keyword中是否出现ArticleContents

var aa = ctx.OBJ1.Where(a => context.OBJ2.Any(b => 
                                     b.ArticleContents.Contains(a.keyword))).ToList();

这将搜索ArticleTitleTitle

的完全匹配
var cc = ctx.OBJ1.Where(a => context.OBJ2.Select(b =>
                                     b.ArticleTitle).ToList().Contains(a.Title)).ToList();

我更改了列名仅仅是为了清楚理解,它将适合您的场景。