在LINQ to SQL join中使用contains

11

如何进行不完全匹配的LINQ to SQL连接?例如,假设我有一个数据表form,其中包含数据John Smith(2),我想将其与表name中的字段Smith连接起来。类似这样的操作:

var query =
    from f in db.form
    join n in db.name
        on f.nameField like '%' + n.firstName + '%'

尽管like关键字似乎不可用于我。

2个回答

14

在 Linq 的 join 中不能使用 like。实际上,在 Linq 中根本不能使用 like,只能使用传统的字符串方法,例如 StartsWithEndsWithContains

您需要这样做:

var query =
    from f in db.form
    from n in db.name.Where(x => f.nameField.Contains(x.firstName))
    ...

1
我不知道是我的代码中是否存在一些奇怪的实现错误,但是这给了我一个错误:只支持在客户端上可以评估的参数用于String.Contains方法。我按照这里的详细说明,使用IndexOf代替Contains,成功让它工作了。 - Cavyn VonDeylen
@CavynVonDeylen 嗯,那似乎是 Linq-to-SQL 的一个限制。在其他 ORM 中,string.Contains 是标准机制。 - p.s.w.g
1
@CavynVonDeylen 你可以尝试以下代码: from n in db.name.ToList().Where(x => f.nameField.Contains(x.firstName)).ToList() 方法会评估实体集并将所有内容从数据库中载入到内存中。通过这样做,您可以使用 string.Contains() 方法。但要注意,不要一次评估表中的所有对象。 - joao.arruda
两个 from 是什么意思?它是否等同于一个 join 语句? - Hp93
1
@Hp93 它相当于 CROSS JOIN,但请注意 Where 限制了要考虑的 db.name 记录集。 - p.s.w.g

6

实际上,有一种方法可以做到,但它不像使用标准的linq语法那样简洁:

from c in dc.Organization
where SqlMethods.Like(c.Hierarchy, "%/12/%")
select *;

(以下翻译内容,来源于链接问题中用户 L P 的回答)

2
+1,这个观点很好,因为OP正在使用Linq-to-SQL,所以这种方法会起作用。在大多数其他情况下,这种方法将无法翻译。 - p.s.w.g
2
@p.s.w.g 真的!应该提到,这是严格的linq-to-sql。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接