Linq在不同表的连接字段中使用“和”运算符搜索文本

时间:2017-08-04 23:27:12

标签: linq search

感谢NetMage在Linq search text using 'and' operator

回答我的问题

现在,请让我问一些更复杂的问题:

我有以下表格,其中localizationdata.EntryIdmascotcategories.Idmascots.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.CategoryNamemascots.Name的翻译字词。

例如,用户可以输入法语关键字“bleu ici”,其中'bleu'来自localizationdata.Value,其中包含已翻译的类别名称,'ici​​'也来自localizationdata.Value吉祥物的翻译名称。我需要吉祥物包含他们的名字和他们的类别名称的上述单词。这可行吗?

1 个答案:

答案 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;