Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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左连接,其中一个字段不区分大小写_C#_Linq_Left Join_Linq To Objects - Fatal编程技术网

C# 如何使用多个字段编写Linq左连接,其中一个字段不区分大小写

C# 如何使用多个字段编写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 {

将此连接转换为左连接的首选方法是什么?这是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
   {
      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();