繁体   English   中英

在 LINQ 中拆分字符串并使用第二个索引值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM