LINQ FirstOrDefault()仅适用于ConcurrentBag <t> </t>

时间:2014-02-23 20:50:59

标签: c# linq wcf azure

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

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);
}

...更新customers集合中的对象仅适用于ConcurrentBag<Customer>。如果集合是List<Customer>代码经过所有动作,选择正确的客户,正确的地址,似乎添加它,但是下一次迭代,集合中的对象没有更新。为什么会这样?我甚至想过使用`ConcurrentBag<T>的唯一原因是因为这发生在另一个存储库中,但是它已经进行了并行操作,我认为这是一个并发问题,即使它不应该存在。现在我在猜测我是如何解决这个以及它为什么会发生的。

相关详细信息:Visual Studio 2012,Windows Azure Web Worker中的WCF服务,.NET 4.5。任何见解都会非常受欢迎......

更新:以下是有问题的实体,使其更加清晰。

CustomerAddress课程有助于解决多对多关系。

public class CustomerAddress
{
    public int CustomerId { get; set; }
    public int AddressId { get; set; }
}

Customer类包含一些基本的客户数据。

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; }
}

希望这可以解决一些问题。

0 个答案:

没有答案