我有这样的linq声明
dbContext.Items
.Where(
p =>
(p.Client.Contact != null && p.Client.Contact.Firstname.ToLower().Contains(searchText.ToLower()))
||
(p.Client.Contact != null && p.Client.Contact.Surname.ToLower().Contains(searchText.ToLower()))
||
(p.PolicyNumber != null && p.PolicyNumber.ToLower().Contains(searchText.ToLower()))
||
(
p.PolicyLivesAssureds
.Where(
pl =>
pl.Contact != null && pl.Contact.Firstname.ToLower().Contains(searchText.ToLower())
|| pl.Contact.Surname.ToLower().Contains(searchText.ToLower())
).Count() > 0
)
)
).OrderBy(p => p.IeUtem);
在自动填充中实际需要这样做。我想要做的是能够确切地知道我的5个条件中的哪个已匹配并显示已匹配的特定项目。例如,假设PolicyNumber已经匹配,我想只发送该行的policynumber,而对于其他人,如果名称已经匹配,我想只发送该行的名称。
有没有办法做到这一点;
答案 0 :(得分:0)
问题变成了如何知道哪些查询匹配。例如,你可以做这样的事情
class AutoCompleteItem {
String Text {get; set;}
Item Item {get; set;}
}
var firstNames = dbContext.Items.Select(p => new AutoCompleteItem { Name = p.Client.Contract.FirstName, Item = p})
var lastNames = dbContext.Items.Select(p => new AutoCompleteItem { Name = p.Client.Contract.SurName, Item = p})
var result = firstName.Union(lastNames).Where(p => p.Name.Contains(searchText)).OrderBy(a => a.Item.IeUtem);
现在,AutcompleteItem是一个包含所需文本的类(可能包含您需要的任何其他字段,例如匹配哪个字段的信息)
这里的想法是MVVM模式。你有你的模型(项目)。现在你需要构建一个viewModel(AutoCompleteItems)来帮助你显示你想要的东西。
答案 1 :(得分:0)
这更像是一种思考的答案,因为它的方法存在缺陷,但我认为它确实解决了你的问题:
double[] items = { 1, 2, 3, 4, 5 };
IEnumerable<Tuple<double, int>> results = items.Select(x =>
{
int index = 0;
foreach (var condition in new Func<bool>[]
{
// TODO: Write conditions here.
() => x == 1,
() => x == 2
})
{
if (condition() == true)
return index;
else
index++;
}
return -1;
}).Zip(items, (matchedCondtion, item) => Tuple.Create(item, matchedCondtion))
.Where(x => x.Item2 != -1);
我使用了一个简单的双数组作为集合的示例进行过滤,但它只是一个例子,你可以使用任何东西。
第一个select为集合中的每个元素返回一个整数。如果存在条件匹配,则返回条件的索引。如果不匹配则返回-1。
它通过枚举Func集合并返回第一个真实条件的索引(模拟||运算符的短路)来实现。如果没有条件匹配,则只需在评估所有条件后返回-1。
然后使用原始集合(使用元组)将这些结果压缩回来,使用其匹配条件(或-1)的索引映射每个元素。
因此示例将返回:
{ 1, 0 },
{ 2, 1 },
{ 3, -1 },
{ 4, -1 },
{ 5, -1 }
然后使用Where
简单地过滤此结果以删除具有-1的任何条目,为您留下与条件匹配的元素集合以及匹配条件的索引(以元组的形式)
因此,要为您的解决方案自定义此选项,您可以删除示例条件并放置您想要的任意数量的条件:
// TODO: Write conditions here.