我是linq的新手,我真的很难从两个列表中获得结果,而第二个表中的记录并不存在。
我有两个班......
cfiles
cfileRecs -id
cfiles,包含存储库中的所有pdf文件,其中cfilesRecs包含每个pdf文件的数据库条目。
这两个类都显示为List和List,我想返回一个列表,其中只包含使用linq在cfilesRecs中找不到的文件。
这是使用的代码,尽管您可能看到linq语法错误。
public static void Main(string[] args)
{
List<cfileRecs> dbScanRecords = dbRecords(); // Contains db records for objects
List<cfiles> awsScanObjects; // Contains objects from aws
using (client = new AmazonS3Client(Amazon.RegionEndpoint.EUWest1))
{
Console.WriteLine("Listing objects stored in a bucket");
awsScanObjects = ListingObjects();
}
List<cfiles> abc = from d in dbScanRecords join aws in awsScanObjects on d.fileName == aws.fileNameRaw
}
示例答案主要涉及与相同类型的列表进行比较 - 而不是在公共属性值上连接两个不同的列表。
感谢大家的例子,但他们似乎没有产生正确的结果我已经创建了一个说明问题的dotnetfiddle https://dotnetfiddle.net/MW6gXF。结果返回6个项目,我应该只得到3个。
答案 0 :(得分:1)
您可以Where()
与Any()
结合使用来实现这一目标:
var result = awsScanObjects.Where(x=> !dbScanRecords.Any(y=> y.filenameRaw == x.filename));
答案 1 :(得分:0)
var result = awsScanObjects.Where(r => !dbScanRecords.Any(r2 => r2.fileName == r.fileNameRaw));
答案 2 :(得分:0)
var files = dbScanRecords.Select(x => x.fileName).ToList();
result = awsScanObjects.Where(x => !files.Contains(x.fileNameRaw)).ToList();
答案 3 :(得分:0)
查找AWS中存在但不存在于dbrecords中的文件。
private class cfileRecs
{
public int Year { get; set; }
public string session { get; set; }
public string center { get; set; }
public string fileNameRaw { get; set; }
}
private class cfiles
{
public string FileName { get; set; }
}
List<cfileRecs> dbScanRecords = new List<cfileRecs>() {
new cfileRecs(){ center = "a", fileNameRaw ="abc.pdf",
session="aaa", Year=1999}};
List<cfiles> awsScanObjects = new List<cfiles>() {
new cfiles(){ FileName = "abc.pdf"},
new cfiles(){ FileName = "bbb"}
};
var filesNotFound = (from files in awsScanObjects
join recs in dbScanRecords
on files.FileName equals recs.fileNameRaw into grp
from g in grp.DefaultIfEmpty()
select new { dbfile = g == null ? null : g.fileNameRaw,
awsfile = files.FileName })
.Where(x => x.dbfile == null).ToList();
fileNotFound包含带有filename =&#34; bbb&#34;的AWS记录,这在dbrecord中找不到
答案 4 :(得分:0)
//我知道您想要查找AWS中存在但不存在于dbrecords中的文件。
var filesNotFound =
(来自awsScanObjects中的文件加入dbScanRecords中的recs
on files.FileName将recs.fileNameRaw等于grp
来自g in grp.DefaultIfEmpty()
选择新{dbfile = g == null? null:g.fileNameRaw,awsfile = files.FileName})
.Where(x =&gt; x.dbfile == null)。ToList();