如何将具有多个条件的SQL SELECT INNER JOIN(带LIKE)查询写入LINQ to SQL

本文关键字:SQL LIKE 查询 to LINQ JOIN SELECT 条件 INNER | 更新日期: 2023-09-27 17:57:55

我一直在寻找如何做到这一点,我发现了一些接近的东西,但不是我想要的。我想知道这是否也能帮助其他人,但我真的需要帮助。我有一个非常简单的SELECT语句,我需要将其转换为LINQ到SQL,以加快软件中的搜索速度:

SELECT  Animals.*
FROM    Animals 
        INNER JOIN AnimalAliases
        ON  Animals.AnimalID = AnimalAliases.AnimalID 
        AND AnimalAliases.Alias LIKE N'%USERINPUT%';

基本上,我希望能够使用多个条件进行内部联接,但其中一个条件与其中一个表LIKE语句无关,这就是我遇到的问题。

var query = 
    from animal in context.Animals
    join animalAlias in context.AnimalAliases
        on new { animal.AnimalID, "USERINPUT" }
    equals new { animalAlias.AnimalID, animalAlias.Alias }
    select animal;

但这显然不起作用,因为我不想等于USERINPUT,我想对它执行各种LIKE操作。

有人有什么见解吗?

如何将具有多个条件的SQL SELECT INNER JOIN(带LIKE)查询写入LINQ to SQL

我想您想要的只是一个普通的WHERE子句?

var query = from animal in context.Animals
   join animalAlias in context.AnimalAliases on animal.AnimalID equals animalAlias.AnimalID
   where animalAlias.Alias.Contains(USERINPUT)
   select animal;

别名文本不是外键关系的一部分,因此它不应该在联接中。


更新-在评论之后-包括来自@Steven的评论-虽然上面的查询是正确的,并且确实模仿了原始SQL-在输出中使用Distinct()可能是明智的-这将防止单个动物可能出现多个别名匹配的情况。

var query = (from animal in context.Animals
   join animalAlias in context.AnimalAliases on animal.AnimalID equals animalAlias.AnimalID
   where animalAlias.Alias.Contains(USERINPUT)
   select animal).Distinct();

这将完成任务:

IQueryable<Animal> query = 
    from animal in context.Animals
    where animal.AnimalAliases
        .Any(a => a.Alias.Contains("USERINPUT"))
    select animal;

或者,您也可以反过来做(从AnimalAlias实体开始,而不是从Animal实体开始):

IQueryable<Animal> query = (
    from animalAlias in context.AnimalAliases
    where animalAlias.Alias.Contains("USERINPUT")
    select animalAlias.Animal)
    .Distinct();