在比较之前,我使用以下IEqualityComparer从公司名称中删除特殊字符,如下所示:
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();
}
}为了在运行查询时调用它,我使用以下命令:
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查询中使用此比较器来查找与输入字符串(公司名称)匹配的所有记录?
例如:
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,而是使用相等比较器来包含特殊字符替换。
发布于 2012-11-06 02:28:36
新变量
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)....
这里使用三元运算符,因为它避免了代价高昂的服务器端合并操作。
新公用列表AllByName(字符串名,整型公司){ var CompanyNameIgnoringSpaces=
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))...
注:对于倒置比较,这两种方法都有各自的局限性。在第一个实现中,数据库越大,构建可用分组的速度就越慢。对于第二个实现,名称的分隔符越多,构建排列所需的时间就越长(指数级)。如果你进行硬编码替换,那么这可以在服务器端完成,从而避免这些限制。
发布于 2012-11-05 22:09:36
用于调用IEqualityComparison的代码(甚至其中使用的代码)不能转换为SQL query,因为IEqualityComparison中的代码是编译的,而不是使用Expression对象构建的。
https://stackoverflow.com/questions/13233747
复制相似问题