using System.Collections.Generic;
public Guid DiscoveryId { get; set; }
public string Foo { get; set; }
public Guid DeviceId { get; set; }
public string Bar { get; set; }
public static void Main()
var devices = new List<Device>();
var assets = new List<Asset>();
for (int i = 0; i < 3; ++i)
var guid = Guid.NewGuid();
assets.Add(new Asset { DiscoveryId = guid, Foo = i.ToString() });
devices.Add(new Device { DeviceId = guid, Bar = (i*2).ToString() });
assets.Add(new Asset { DiscoveryId = Guid.NewGuid(), Foo = "Foo" });
devices.Add(new Device { DeviceId = Guid.NewGuid(), Bar = "Bar" });
Console.WriteLine("Assets:");
foreach (var asset in assets) Console.WriteLine($"{asset.DiscoveryId}: {asset.Foo}");
Console.WriteLine("Devices:");
foreach (var device in devices) Console.WriteLine($"{device.DeviceId}: {device.Bar}");
Console.WriteLine("Filtered:");
var assetDevices = assets.Where(a => devices.Any(d => d.DeviceId == a.DiscoveryId));
foreach (var asset in assetDevices) Console.WriteLine($"{asset.DiscoveryId}: {asset.Foo}");
var sameAssets = assets.Where(a => devices.Any(d => d.DeviceId == a.DiscoveryId));
foreach (var asset in sameAssets)
var device = devices.SingleOrDefault(d => d.DeviceId == asset.DiscoveryId);
if (device is null) continue;
Console.WriteLine("Updated:");
foreach (var asset in assetDevices) Console.WriteLine($"{asset.DiscoveryId}: {asset.Foo}");