我一直在寻找如何做到这一点,我发现了一些接近的东西,但并不是我正在寻找的东西。我想知道这是否也可以帮助其他人,但我真的可以使用帮助。我有一个非常简单的SELECT语句,我需要转换为LINQ to 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;
但这显然不起作用,因为我不想EQUALS到USERINPUT,我想对它执行各种LIKE操作..
任何人都有见解?
答案 0 :(得分:3)
我认为您正在寻找的只是一个普通的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();
答案 1 :(得分:0)
这样可以解决问题:
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();