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

本文关键字:返回 实体 连接 一个 字段 Linq 两个 | 更新日期: 2023-09-27 18:11:05

我正在使用一个数据库,其中外键已被忘记,我无法修改它。

这个想法是用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中一样,它用于在一个属性上相交的两个表的合成表示。

你知道哪个接线员最适合我的情况吗?

谢谢!

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

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

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

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

尝试这些解决方案

这将搜索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();

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