问题描述
|
我一直在寻找如何执行此操作的过程,但发现很接近,但并不是我想要的。我想知道这是否也会对其他人有所帮助,但是我真的可以使用该帮助。我有一个非常简单的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;
但这显然不起作用,因为我不希望与USERINPUT相等,所以我想对其执行各种LIKE操作。
有人有见识吗?
解决方法
我认为您正在寻找的只是正常的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();