首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IEqualityComparer查找记录

使用IEqualityComparer查找记录
EN

Stack Overflow用户
提问于 2012-11-05 22:05:26
回答 2查看 410关注 0票数 3

在比较之前,我使用以下IEqualityComparer从公司名称中删除特殊字符,如下所示:

代码语言:javascript
复制
 public class CompanyNameIgnoringSpaces : IEqualityComparer<LeadGridViewModel>
    {
        public bool Equals(LeadGridViewModel x, LeadGridViewModel y)
        {
            var delimiters = new[] {' ', '-', '*', '&', '!'};
            return delimiters.Aggregate(x.CompanyName ?? String.Empty, (c1, c2) => c1.Replace(c2, '\0')) 
                == delimiters.Aggregate(y.CompanyName ?? String.Empty, (c1, c2) => c1.Replace(c2, '\0'));
        }

        public int GetHashCode(LeadGridViewModel obj)
        {
            var delimiters = new[] {' ', '-', '*', '&', '!'};
            return delimiters.Aggregate(obj.CompanyName ?? String.Empty, (c1, c2) => c1.Replace(c2, '\0')).GetHashCode();
        }
    }

为了在运行查询时调用它,我使用以下命令:

代码语言:javascript
复制
var results = result
                  .GroupBy(c => c, new CompanyNameIgnoringSpaces())
                  .Select(g => new LeadGridViewModel
                  {
                      LeadId = g.First().LeadId,
                      Qty = g.Count(),
                      CompanyName = g.Key.CompanyName,
                  }).OrderByDescending(x => x.Qty).ThenBy(x => x.CompanyName).ToList();

如何在LINQ查询中使用此比较器来查找与输入字符串(公司名称)匹配的所有记录?

例如:

代码语言:javascript
复制
 public List<LeadGridViewModel> AllByName(string name, int company)
        {

            var result = (from t1 in db.Leads
                          where
                              t1.Company_ID == company && t1.Company_Name == name...

因此,我不使用t1.Company_Name == name,而是使用相等比较器来包含特殊字符替换。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-06 02:28:36

  1. 在linqToDatabase查询中使用IEqualityComparer :除非您可以将逻辑封装在提供程序可以转换的形式中,否则必须在本地完成。从您处理此问题的方式来看,我假设提供商无法处理此问题。因此,我们可以在本地执行以下操作:

新变量

代码语言:javascript
复制
1. Pull it all in:

= result.ToArray() .GroupBy(c => c,CompanyNameIgnoringSpaces()) .Select(g => new LeadGridViewModel { LeadId = g.First().LeadId,Qty = g.Count(),CompanyName = g.Key.CompanyName,}).OrderByDescending(x => x.Qty).ThenBy(x => )();

2. ToLookup()

var .ToLookup= result results (c => c,CompanyNameIgnoringSpaces()) .Select(g => new LeadGridViewModel { LeadId = g.First().LeadId,Qty = g.Count(),CompanyName = g.Key.CompanyName,}).OrderByDescending(x => x.Qty).ThenBy(x => x.CompanyName).ToList();

3.结果流传输

var结果= result.AsEnumerable() .GroupBy(c => c,CompanyNameIgnoringSpaces()) .Select(g => new LeadGridViewModel { LeadId = g.First().LeadId,Qty = g.Count(),CompanyName = g.Key.CompanyName,}).OrderByDescending(x => x.Qty).ThenBy(x => x.CompanyName)();

注意: sql的大多数变体都有一个替换函数,因此您可以将替换代码硬编码到表达式中,因此可以在服务器端执行此操作。如果你希望它是可重用的,你会想要类似于下面这样的东西:

private static Expression> leadGridTransform = (lead) => lead.CompanyName == null?"",lead.CompanyName.Replace(‘','\0').Replace....;

然后您就可以在可查询表达式中使用它:

var结果= result.GroupBy(leadGridTransform)....

这里使用三元运算符,因为它避免了代价高昂的服务器端合并操作。

  1. 查找某个字符串的所有记录:在这里,您确实希望颠倒比较,找到与给定字符串相等的所有字符串,然后查询其中包含的公司名称。假设db.Leads是一个包含LeadGridViewModel的表,因此我们可以使用

新公用列表AllByName(字符串名,整型公司){ var CompanyNameIgnoringSpaces=

代码语言:javascript
复制
1. Implicit inversion:

CompanyNameIgnoringSpaces();var => = db.Leads.Select(lead => new LeadGridViewModel { CompanyName = lead.CompanyName }) .AsEnumerable() .Where(lead => comparer.Equals(name,lead.CompanyName) .ToArray();var结果= db.Leads.Where(lead => lead.Company_ID == company) .Where(lead => group.Contains(lead.CompanyName))...

2.显式反转:

私有var分隔符= new[] {‘','-','*','&','!'};公用列表AllByName(字符串名,整型公司){ var atomicName =name.Trim().Split(分隔符);IEnumerable排列= atomicName.Aggregate(新String[] { "“},(累加,原子) =>原子==”“?accumulate.Join(分隔符,字符串=> true,chr => true,( str,chr) =>字符串+原子+ chr.ToString()):累加) .ToArray();var result = db.Leads.Where(lead => lead.Company_ID == company) .Where(lead => permutations.Contains(lead.CompanyName))...

注:对于倒置比较,这两种方法都有各自的局限性。在第一个实现中,数据库越大,构建可用分组的速度就越慢。对于第二个实现,名称的分隔符越多,构建排列所需的时间就越长(指数级)。如果你进行硬编码替换,那么这可以在服务器端完成,从而避免这些限制。

票数 1
EN

Stack Overflow用户

发布于 2012-11-05 22:09:36

用于调用IEqualityComparison的代码(甚至其中使用的代码)不能转换为SQL query,因为IEqualityComparison中的代码是编译的,而不是使用Expression对象构建的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13233747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档