C# 如何使用多个字段编写Linq左连接,其中一个字段不区分大小写
将此连接转换为左连接的首选方法是什么?这是Linq到对象,而不是SQLC# 如何使用多个字段编写Linq左连接,其中一个字段不区分大小写,c#,linq,left-join,linq-to-objects,C#,Linq,Left Join,Linq To Objects,将此连接转换为左连接的首选方法是什么?这是Linq到对象,而不是SQL var result = ( from e in entries from r in results where r.PropertyId == e.PropertyId && e.ValueAsString.Equals(r.Value, StringComparison.InvariantCultureIgnoreCase) select new {
var result =
(
from e in entries
from r in results
where r.PropertyId == e.PropertyId &&
e.ValueAsString.Equals(r.Value, StringComparison.InvariantCultureIgnoreCase)
select new
{
Result = r,
Entry = e
}
)
.ToList();
问题:可读性与效率之间的权衡。应该尽量避免ToLowerInvariant?您编写的是交叉连接,而不是左连接
对于左连接,您需要使用
您编写的是交叉连接,而不是左连接不完全确定您是否需要查询本身的帮助或只需要比较字符串,但要找到性能更好的方法,您可以运行测试abc.EqualsAbC、StringComparison.InvCultIC vs abc.EqualsAbC.ToLowerInv。当然,你也可以对测试用例更疯狂。我应该提到,每个条目只能有0或1个结果匹配。我知道这是一个交叉,但我不知道join关键字会创建一个内部查找,以避免来自user@Servy的交叉比较。谢谢这恰好适用于非常小的集合。我对此感到困惑,但只会对我知道的内容进行评论:r==null?null:r只是r。看起来这会得到正确的答案,但仍然作为嵌套线性搜索执行。仅适用于小型设备。@Servy告诉我,在执行过程中,使用join关键字将添加一个内部查找表,以便获得通用答案。
var result =
(
from e in entries
join r in results
let ev=e.ValueAsString.ToLower()
let rv=r.Value.ToLower()
on new{e.PropertyId,ev} equals new {r.PropertyId,rv } into lg
from r in lg.DefaultIfEmpty()
select new
{
Result = r,
Entry = e
}
)
.ToList();
var result =
(
from e in entries
from r in results.Where(x => x.PropertyId == e.PropertyId)
.Where(x => e.ValueAsString.Equals(x.Value, StringComparison.InvariantCultureIgnoreCase))
.DefaultIfEmpty()
select new
{
Result = r,
Entry = e
}
)
.ToList();