1

这是一个示例模式,其中“=>”表示“一对多”关系:

Contract => ContractCustomers
Contract => ContractDiscounts
Customers => ContractCustomers
DiscountType => ContractDiscounts

我正在尝试检索合同对象及其所有相关详细信息使用对服务器的一次调用。

到目前为止,我使用了 LoadWith:

 using (Data.ABWXDataContext db = new Data.ABWXDataContext())
            {
                DataLoadOptions options = new DataLoadOptions();
                options.LoadWith<Data.Contract>(c => c.ContractCustomers);
                options.LoadWith<Data.Contract>(c => c.ContractDiscounts);
                options.LoadWith<Data.ContractDiscount>(c => c.DiscountType);
                options.LoadWith<Data.ContractCustomer>(c => c.Customers);
                db.LoadOptions = options;
                var Contract = from con in db.Contracts
                               where con.ContractId == contractId
                               select con;
                return Contract.ToList();
            }
        }

上面的代码可以很好地包含 ContractDiscounts 和 ContractCustomers 表。但是它不允许我访问(折扣类型,客户)。我明白他们不是合同的孩子,我怎么能带着合同对象陪他们呢?

如果这是一项简单的常见任务,我深表歉意。

4

2 回答 2

0

我发现这个问题的答案对我有用

复制答案:

我发现它是什么!Linq to SQL 会将 [DataMember()] 属性放在子记录上,而不是父记录上。我必须在关联下添加 [DataMember()] 属性。

不利的一面是这是 context.designer.cs 的手动输入,如果更改 dbml,它将被覆盖:-(

[Association(Name="CustomerStatus_Customer", Storage="_CustomerStatus", ThisKey="CustomerStatusId", OtherKey="CustomerStatusId", IsForeignKey=true)]
[DataMember()]
public CustomerStatus CustomerStatus
{
    get
    {
        return this._CustomerStatus.Entity;
    }
    set
    { 
      ...
     }
 }
于 2013-10-26T16:45:03.577 回答
0

您可以添加不从以下位置开始的加载选项Contract

options.LoadWith<Data.ContractCustomer>(c => c.Customer);
options.LoadWith<Data.ContractDiscount>(c => c.Discount);

请注意,添加许多加载选项可能会导致触发多个查询(1 + n 问题)。您必须检查它是否仍然有效。以后按需查询相关数据可能效率更高。

于 2013-10-25T08:56:30.690 回答