【问题标题】:Use contains in LINQ to SQL join在 LINQ to SQL 连接中使用 contains
【发布时间】:2013-07-02 16:43:05
【问题描述】:

如何在没有完全匹配的情况下执行 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 关键字。

【问题讨论】:

    标签: c# linq linq-to-sql join


    【解决方案1】:

    您不能在 Linq 联接中使用 like。事实上,你根本不能在 Linq 中使用 like,只能使用常规的字符串方法,如 StartsWithEndsWithContains

    你必须这样做:

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

    【讨论】:

    • 我不知道我的代码中是否存在一些奇怪的实现错误,但这给了我一个错误:Only arguments that can be evaluated on the client are supported for the String.Contains method. 我使用IndexOf 而不是Contains 让它工作了详细here
    • @CavynVonDeylen 嗯,这似乎是 Linq-to-SQL 的限制。 string.Contains 是其他 ORM 中的标准机制。
    • @CavynVonDeylen 您可以尝试执行以下操作from n in db.name.ToList().Where(x => f.nameField.Contains(x.firstName)).ToList() 方法评估实体集并将数据库中的所有内容放入内存中。通过这样做,您可以使用string.Contains() 方法。请注意,不要一次评估表中的所有对象。
    • 两个froms 是什么意思?它是否等于 join 声明?
    • @Hp93 它等同于CROSS JOIN,但请注意Where 确实限制了正在考虑的db.name 的记录集。
    【解决方案2】:

    其实也有a way of doing it,但是不如使用标准的linq的东西那么整洁:

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

    (借用用户LP在链接问题中的回答)

    【讨论】:

    • +1 好点,这将起作用,因为 OP 使用的是 Linq-to-SQL。在大多数其他情况下,此方法不会翻译。
    • @p.s.w.g 真的!应该提到,这是严格的 linq-to-sql。
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多