Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ-Refactor。包含对IEnumerable的比较<;字符串>;区分大小写_C#_Linq_Entity Framework_Contains - Fatal编程技术网

C# LINQ-Refactor。包含对IEnumerable的比较<;字符串>;区分大小写

C# LINQ-Refactor。包含对IEnumerable的比较<;字符串>;区分大小写,c#,linq,entity-framework,contains,C#,Linq,Entity Framework,Contains,我认为这应该是一个相当简单的linq问题。我正在使用Contains进行字符串比较,它的行为区分大小写,我需要它不区分大小写。我知道正确的方法是使用IndexOf方法重载,该重载接受StringComparison.OrdinalIgnoreCase参数 问题是我挂起(emailAddresses)的IndexOf的对象是字符串枚举,因此没有可用的IndexOf。我还尝试了emailAddresses.Contains(x.Email,StringComparer.InvariantCultur

我认为这应该是一个相当简单的linq问题。我正在使用
Contains
进行字符串比较,它的行为区分大小写,我需要它不区分大小写。我知道正确的方法是使用
IndexOf
方法重载,该重载接受
StringComparison.OrdinalIgnoreCase
参数

问题是我挂起(emailAddresses)的
IndexOf
的对象是字符串枚举,因此没有可用的
IndexOf
。我还尝试了
emailAddresses.Contains(x.Email,StringComparer.InvariantCultureInogoreCase
),但它引发了以下错误:

LINQ to Entities无法识别方法“Boolean Contains[String](System.Collections.Generic.IEnumerable 1[System.String],System.String,System.Collections.Generic.IEqualityComparer 1[System.String])方法

如何重构它,使
.Where(x=>emailAddresses.Contains(x.Email)
部分不区分大小写

public IList<string> FindInvalidEmails(UserContext userContext, IEnumerable<string> emailAddresses)
{
    var validEmails = new List<string>();

    emailAddresses.ForEachChunk(100, emailAddressesChunk =>
        validEmails.AddRange(_enterpriseRepositoryFactory.GetMemberRepository(userContext.EnterpriseId).FindAll()
                                    .Where(x => emailAddresses.Contains(x.Email) && !x.IsDeleted)
                                    .Select(x => x.Email)
                                    .ToList())
    );

    return emailAddresses.Except(validEmails).ToList();
}
public IList FindInvalidEmails(UserContext UserContext,IEnumerable emailAddresses)
{
var validEmails=新列表();
emailAddresses.ForEachChunk(100,EmailAddressChunk=>
validEmails.AddRange(_enterpriseRepositoryFactory.GetMemberRepository(userContext.EnterpriseId.FindAll)()
其中(x=>emailAddresses.Contains(x.Email)&&&!x.IsDeleted)
.选择(x=>x.Email)
.ToList())
);
返回emailAddresss.Exception(validEmails.ToList();
}
那么:

.Where(x => emailAddresses.Select(y => y.ToLower()).Contains(x.Email.ToLower()) 
它会将所有集合元素更改为小写版本,并尝试在该集合中查找用户电子邮件的小写版本

您可以选择
touper
,但这应该没有什么区别


如果是LINQ到对象查询,您可能应该使用
ToLowerInvariant
,但是因为LINQ到实体不支持它,所以您必须在这里使用
ToLower

如果emailAddresses是
IEnumerable
,您可以

.Where(x => emailAddresses.Any(em => em.ToLower() == x.Email.ToLower()) 


我想到了这一点,但如果在某些语言中,这不会失败吗?我必须支持中文、俄文、荷兰语等。我不确定
任何版本的
是否能工作。将其转换为SQL查询可能会有问题。我不知道为什么会删除注释,但你是正确的:
电子邮件地址
本身就是一个列表,因此它必须被删除e也进行了迭代,而不是对其调用
ToLower()
。@Jeroenvanevel你是对的!我错过了。更新了我的答案。实际上,最好使用
ToUpperInvariant
per-“在规范化字符串进行比较时,使用String.ToUpperInvariant方法,而不是String.ToLowerInvariant方法。”@LinqTo实体不支持AlexeiLevenkov
ToUpperInvariant
,因此无法将其转换为正确的SQL语句。+1.很好的一点-我总是无法读懂帖子中的每个字符…你可能应该至少添加半句话来解释为什么这段代码是这样的……你应该更清楚地说明你的
IEnnumerable
来自实体框架,否则您将得到许多实际上不起作用的答案。
//Build a list of lower emails in memory
var lowerEmails = emailAddress.Select(em => em.ToLower()).ToList();
...
.Where(x => lowerEmails.Contains(x.Email.ToLower())