感谢NetMage在Linq search text using 'and' operator
回答我的问题现在,请让我问一些更复杂的问题:
我有以下表格,其中localizationdata.EntryId
与mascotcategories.Id
和mascots.Id
相关联,具体取决于localizationdata.Type
值。
`localizationdata` (
`Id` int(11)`, Type` varchar(45),
`EntryId` int(11),
`LanguageId` int(11),
`Value` varchar(150) }
`mascots` (
`Id` int(11), `Name` varchar(100),
`MascotCategoryId` int(11),
`UserId` varchar(100),
`mascotcategories` (
`Id` int(11), `CategoryName` varchar(45),
`IsVisible` bit(1),
`ParentId` int(11) DEFAULT NULL,
`SawgrassOnly` bit(1)
我需要再次'并'搜索(如上面链接中的上一个问题)localizationdata.value
,其中包含mascotcategories.CategoryName
和mascots.Name
的翻译字词。
例如,用户可以输入法语关键字“bleu ici”,其中'bleu'来自localizationdata.Value
,其中包含已翻译的类别名称,'ici'也来自localizationdata.Value
吉祥物的翻译名称。我需要吉祥物包含他们的名字和他们的类别名称的上述单词。这可行吗?
答案 0 :(得分:0)
我不确定这是多么优越,但我相信它有效:
首先,将两种类型的本地化减少到一种常见类型:
var mascotNameLocalized = from ld in db.localizationdata
where ld.Type == "mascot"
group ld by ld.EntryId into ldg
select new { MascotId = ldg.Key, Words = ldg.Select(g => g.Value) };
var mascotCategoriesLocalized = from ld in db.localizationdata
where ld.Type == "mascotcategory"
join mc in db.mascotcategories on ld.EntryId equals mc.Id
join m in db.mascots on mc.Id equals m.MascotCategoryId into mj
where mj.Any()
from m in mj
group ld by m.Id into ldg
select new { MascotId = ldg.Key, Words = ldg.Select(g => g.Value) };
然后将它们组合成一个共同的列表:
var mascotsLocalized = from m in mascotNameLocalized.Concat(mascotCategoriesLocalized)
group m by m.MascotId into mg
select new { MascotId = mg.Key, Words = mg.SelectMany(m2 => m2.Words).ToList() };
然后找到所有符合所有搜索字词的吉祥物:
var srch = "bleu ici";
var srchwords = srch.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var ans = from m in mascotsLocalized
where srchwords.All(sw => m.Words.Contains(sw))
select m.MascotId;