Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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 Lambda表达式实现左联接时出现NullReferenceException_C#_Linq_Lambda_Left Join - Fatal编程技术网

C# 尝试使用Linq Lambda表达式实现左联接时出现NullReferenceException

C# 尝试使用Linq Lambda表达式实现左联接时出现NullReferenceException,c#,linq,lambda,left-join,C#,Linq,Lambda,Left Join,其思想是使用LINQ的lambda表示法执行左连接。情况如下: 我有一个列表dbList,其中包含由以下代码生成的条目(DateTime)UploadTimestamp、(int)EntityId、和(string)FileName: var dbList=Db.Pages.Where(s=>s.IsCurrent==true)。 联接(Db.Files,//(内部)表以联接 o=>o.FileId,//outerKeySelector i=>i.Id,//innerKeySelector (o

其思想是使用LINQ的lambda表示法执行
左连接。情况如下:

我有一个列表
dbList
,其中包含由以下代码生成的条目
(DateTime)UploadTimestamp
(int)EntityId
、和
(string)FileName

var dbList=Db.Pages.Where(s=>s.IsCurrent==true)。
联接(Db.Files,//(内部)表以联接
o=>o.FileId,//outerKeySelector
i=>i.Id,//innerKeySelector
(o,res)=>新建//结果选择器
{UploadTimestamp=o.SubmissionDate,
o、 EntityId,
res.FileName
});
然后我有另一个列表,其中有字段
(String)FullPath
(String)FileName
(DateTime)LastModified
。代码是

var rootLocation = ConfigurationManager.AppSettings["EXPORT-FILE-LOCATION"];
string[] entries = Directory.GetFiles(rootLocation, "*.csv");
var fileList = entries.Select(x => new {
     FullPath = x,
     FileName = Path.GetFileName(x),
     LastModified = File.GetLastWriteTime(x)
});
为了比较这两个时间戳,这两个表应该通过
FileName
连接起来。我会用SQL写

从文件列表中选择left.*,right.*作为left
LEFT JOIN dbList as right ON LEFT.FileName=right.FileName
其中left.LastModified>right.UploadTimestamp或right.FileName为空
但我如何用LINQ lambda表示法做到这一点呢?首先,我尝试不使用
WHERE
条件,灵感来自

var comboList=fileList.GroupJoin(//外部序列
dbList,//内部序列
outerTab=>outerTab.FileName,//outerKeySelector
innerTab=>innerTab.FileName,//innerKeySelector
(x,y)=>new{Links=x,Rechts=y})。
选择many(x=>x.Rechts.DefaultIfEmpty(),
(x,y)=>新{
y、 文件名,DatabaseTable=y.EntityId,
x、 Links.FullPath,y.UploadTimestamp,
x、 Links.LastModified
//过时=日期时间。比较(y.UploadTimestamp,x.outerTab.LastModified)>0?false:true
});
这不起作用,我当前收到错误消息:

System.NullReferenceException:'对象引用未设置为对象的实例。'y为null


我只知道那是什么意思用LINQ lambda表示法实现上面的SQL语句的正确方法是什么?非常感谢您的帮助。

查看错误,发现y为空

在取消引用之前,请确保y不为空

SelectMany( x => x.Rechts.DefaultIfEmpty(),
    (x, y) => new { 
      Filename = y?.FileName, 
      DatabaseTable = y?.EntityId,
      x.Links.FullPath, 
      UploadTimestamp = y?.UploadTimestamp,
      x.Links.LastModified

这确实意味着生成的对象可以将
FileName
DatabaseTable
UploadTimestamp
设置为null,因此使用这些对象的用户在使用它们之前也应该检查它们是否为null。

简单的解决方案就是添加一些巧妙的问号,但它节省了我的时间!