说明linq中哪些条件匹配

时间:2016-01-26 09:28:07

标签: c# sql database linq select

我有这样的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,而对于其他人,如果名称已经匹配,我想只发送该行的名称。

有没有办法做到这一点;

2 个答案:

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