[英]Spliting string in LINQ and using 2nd Index value
我坚持拆分电子邮件以获取 LINQ 的 group by 子句中的电子邮件域,以按域对数据进行分组。 我的 LINQ 是
(
from u in DbContext.UserProfiles
join ap in DbContext.AspNetUsers
on u.PhoneNo equals ap.PhoneNumber
where u.IsVerified == true
let domainName = ap.Email.Split('@').Skip(1).FirstOrDefault()
/*ap.Email.Split('@')[1]
ap.Email.Substring(ap.Email.IndexOf('@') + 1, ap.Email.Length)
ap.Email.Split('@').ElementAt(1)
GetDomainHost(ap.Email)*/
group ap by new
{
DomainName = domainName
}
into grp
select new
{
grp.Key.DomainName,
TotalUsers = grp.Count()
};
)
注意:我也尝试过注释代码,但仍然向我展示了LINQ not supported
相同异常
我需要拆分电子邮件并获取将位于第二个索引上的域。 我该如何解决这个问题?
编辑:
我面临转换的例外是
LINQ to Entities 无法识别方法 'System.String ElementAt[String](System.Collections.Generic.IEnumerable`1[System.String], Int32)' 方法,并且此方法无法转换为存储表达式。
实际上,我正在尝试转换此SQL
select dbo.GetDomainFromEmail(ap.Email) as 'Domains', Count(*) as 'Total Users'
from AspNetUsers ap
join UserProfile up
on ap.PhoneNumber = up.PhoneNo and
up.IsVerified = 1
group by dbo.GetDomainFromEmail(ap.Email)
到LINQ
。 和dbo.GetDomainFromEmail(ap.Email)
是一个函数,定义为Substring(ap.Email, Charindex('@', ap.Email)+1, LEN(ap.Email))
。
我建议使用正则表达式组。 这里有一个例子:
string emailAdress = "yourEmailHere@theDomain.net";
Regex pattern = new Regex("@(?<domain>[a-zA-Z0-9]*)");
Match match = pattern.Match(emailAdress);
string domain = match.Groups["domain"].Value;
您可能希望在使用Split
之前先执行查询,因为Linq to Entity不支持Split
方法。 因此,您可以使用AsEnumerable
使选择发生在内存中而不是 EF 中。
所以我们可以先得到所有的域名:
var emails = (from u in DbContext.UserProfiles
join ap in DbContext.AspNetUsers
on u.PhoneNo equals ap.PhoneNumber
where u.IsVerified == true
select new
{
Email = ap.Email
}).Distinct().AsEnumerable();
然后我们可以从emails
获取所有域。
更新:
此外,如果您想避免将数据加载到内存中,那么您可以执行纯 SQL 查询来获取所有域:
var results = db1New.Database.SqlQuery<string>("
SELECT
SUBSTRING(up.Email, CHARINDEX('@', up.Email) + 1, LEN(up.Email) ) AS Domain
FROM dbo.UserProfiles up
GROUP BY SUBSTRING(up.Email, CHARINDEX('@', up.Email) + 1,
LEN(up.Email))").ToArray();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.