C# 尝试使用Linq Lambda表达式实现左联接时出现NullReferenceException
其思想是使用LINQ的lambda表示法执行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
左连接。情况如下:
我有一个列表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。简单的解决方案就是添加一些巧妙的问号,但它节省了我的时间!