如何使用c#和linq返回两个列表中找不到的记录

时间:2015-03-11 14:50:09

标签: c# linq

我是linq的新手,我真的很难从两个列表中获得结果,而第二个表中的记录并不存在。

我有两个班......

  • cfiles

    • 会话
    • 中心
    • fileNameRaw
  • 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个。

5 个答案:

答案 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();