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 FirstOrDefault()仅适用于ConcurrentBag<;T>;_C#_Linq_Wcf_Azure - Fatal编程技术网

C# LINQ FirstOrDefault()仅适用于ConcurrentBag<;T>;

C# LINQ FirstOrDefault()仅适用于ConcurrentBag<;T>;,c#,linq,wcf,azure,C#,Linq,Wcf,Azure,这里有一个相当简单的三部分任务。第一部分是从数据库获取数据。没问题。第二部分是解析该数据(在这里使用测试中可模拟性适配器完成)。再说一次,没问题。最后,对于多对多关系,获取所有请求的数据并相应地进行分配。同样有效,但有一个陷阱。在下面的代码中 var customers = new ConcurrentBag<Customer>(); /* or List<Customer>(); */ // populate the initial customer data...

这里有一个相当简单的三部分任务。第一部分是从数据库获取数据。没问题。第二部分是解析该数据(在这里使用测试中可模拟性适配器完成)。再说一次,没问题。最后,对于多对多关系,获取所有请求的数据并相应地进行分配。同样有效,但有一个陷阱。在下面的代码中

var customers = new ConcurrentBag<Customer>(); /* or List<Customer>(); */

// populate the initial customer data...

var customerAddresses = data[Manifest.CustomerAddresses].Select(r => new CustomerAddress
{
    CustomerId = QueryUtility.GetInt32FromRow(r, "customer_id"),
    AddressId = QueryUtility.GetInt32FromRow(r, "address_id")
});

var addressIds = customerAddresses.Select(x => x.AddressId).Distinct().ToList();
var addresses = _addressRepository.GetAddresses(addressIds, manifest);

foreach (var customerAddress in customerAddresses)
{
    var customer = customers.FirstOrDefault(x => x.Id == customerAddress.CustomerId);
    var address = addresses.FirstOrDefault(x => x.Id == customerAddress.AddressId);

    if (customer != null && address != null) customer.Addresses.Add(address);
}
Customer类保存一些基本的客户数据

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    [ ... ] 
    public List<Address> Address { get; set; }
}

希望这能把事情弄清楚一点。

有打字错误吗?我假设最后一个任务是
customeraddress.Add(…)
?我很困惑-代码实际上在做什么?有一个customerAddresses集合在开始时初始化,然后您获取所有地址的地址-[编辑:刚刚意识到这些地址稍后会使用,抱歉],最后您循环初始集合,获取客户和地址并将其分配给其他一些集合
客户
(或者它是同一个带有打字错误的集合?)。哪一个是ConcurrentBag?什么是
客户
-它来自哪里?不,
客户
是从集合中选择的对象,它具有类型为
列表
的属性,称为
地址
。您所指的对象只是一个链接实体。Joanna,我建立了基本的类结构。在所有这些之前,会声明
客户
集合,并在我检查是否还需要为客户获取地址列表之前使用客户信息进行更新,如果已请求地址,则会进行更新。这听起来不可能。您可以确定,当您使用
ConcurrentBag
时,该代码会起作用,但如果e您所做的唯一更改是将其替换为
列表
,那么代码就不起作用了?我强烈建议您发布一个自包含的可复制示例来说明这种行为(即,我可以在我的机器上运行的东西)。如果不这样做,我建议您在其他地方查找程序中的错误。
public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    [ ... ] 
    public List<Address> Address { get; set; }
}
public class Address
{
    public int Id { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public City City { get; set; }
    public State State { get; set; }
    public string ZipCode { get; set; }
}