2

例如,我有一个名为 Product 的列表,它有 3 列,ProductName(即标题)、ProductPrice 和 ProductType。

  • ProductName 是一个字符串
  • ProductPrice 是一种货币(双)
  • ProductType 是 ProductTypes 列表的查找

通常,如果它不包含查找列,这对我来说很容易,但我不知道如何在插入时处理查找列。

我试过这个,但它返回一个错误Specified cast is not valid.

这是当前代码

EntityList<ProductTypeItem> ProductTypes = dc.GetList<ProductTypeItem>("ProductType");

ProductItem newProduct = new ProductItem();

newProduct.Title = txtProductName.Text;
newProduct.ProductPrice = double.Parse(txtProductPrice.Text); 
newProduct.ProductType = (from a in ProductTypes where a.Title == ddProductType.SelectedItem.Text select a).FirstOrDefault();

dc.Product.InsertOnSubmit(newProduct);
dc.SubmitChanges();   

我会怎么做,newProduct.ProductType因为这里是错误发生的地方。

请注意,ddProductType DataSource 是ProductType 列表Title在其DataTextFieldDataValueField

4

5 回答 5

1

可能会帮助你。第一个示例解释了插入应该如何处理指向现有数据的链接。此示例代码应该为您提供足够的提示来帮助您解决问题:

AdventureWorksDataContext db = new AdventureWorksDataContext();

// LINQ query to get StateProvince
StateProvince state = (from states in db.StateProvinces
                       where states.CountryRegionCode == "AU" && states.StateProvinceCode == "NSW"
                       select states).FirstOrDefault();
// LINQ function to get AddressType
AddressType addrType = db.AddressTypes.FirstOrDefault(s => s.Name == "Home");

Customer newCustomer = new Customer()
{
    ModifiedDate= DateTime.Now,
    AccountNumber= "AW12354", 
    CustomerType='I',
    rowguid= Guid.NewGuid(),
    TerritoryID= state.TerritoryID    // Relate record by Keys
};
Contact newContact = new Contact()
{
    Title = "Mr",
    FirstName = "New",
    LastName = "Contact",
    EmailAddress = "newContact@company.com",
    Phone = "(12) 3456789", 
    PasswordHash= "xxx",
    PasswordSalt= "xxx",
    rowguid = Guid.NewGuid(),
    ModifiedDate = DateTime.Now
};
Individual newInd = new Individual()
{
    Contact= newContact,    // Relate records by objects (we dont actually know the Keys for the new records yet)
    Customer= newCustomer,
    ModifiedDate= DateTime.Now
};
Address newAddress = new Address()
{
    AddressLine1= "12 First St",
    City= "Sydney",
    PostalCode= "2000", 
    ModifiedDate=DateTime.Now,
    StateProvince= state,
    rowguid = Guid.NewGuid()
};

// Link our customer with their address via a new CustomerAddress record
newCustomer.CustomerAddresses.Add(new CustomerAddress() { Address = newAddress, Customer = newCustomer, AddressType = addrType, ModifiedDate = DateTime.Now, rowguid = Guid.NewGuid() });

// Save changes to the database
db.SubmitChanges();
于 2011-03-02T23:30:39.067 回答
0

我不熟悉Linq to SharePoint,但我认为它类似于客户端对象模型。如果是这样,您将需要使用FieldLookupValue作为值newProduct.ProductType并使用ID查找的值作为值:

newProduct.ProductType = new FieldLookupValue { LookupId = 1 };

这意味着您需要有权访问查询中的查找ListIDProductTypes

于 2011-03-02T23:41:23.983 回答
0

你的做法对我来说似乎是正确的。这与我一直在成功地做到这一点的方式相同。您确定问题是查找列吗?双倍是货币的正确类型吗?货币通常保存为小数,而不是双精度。

顺便说一句,您不必单独获取实体列表。SPMetal 制作简写 dc.ProductType,就像您在 insertOnSubmit 中已经使用的一样。不知道为什么所有示例都这样做...

尝试稍微拆分分配并再次调试。看看一切是不是应该的。

ProductItem newProduct = new ProductItem();
string selectedProductType = ddProductType.SelectedItem.Text;
ProductTypeItem productType = (from a in dc.ProductType
                               where a.Title == selectedProductType
                               select a).FirstOrDefault();

newProduct.Title = txtProductName.Text;
newProduct.ProductPrice = decimal.Parse(txtProductPrice.Text); 
newProduct.ProductType = productType;

dc.Product.InsertOnSubmit(newProduct);
dc.SubmitChanges();

希望这可以帮助

于 2011-03-03T14:27:44.757 回答
0

它现在有效,这是解决方案

EntityList<Item> ProductTypes = dc.GetList<Item>("ProductType");
Item oProductType = (from a in ProductTypes where a.Title == ddProductType.SelectedItem.Text select a).FirstOrDefault();
ProductItem newProduct = new ProductItem();

newProduct.Title = txtProductName.Text;
newProduct.ProductPrice = double.Parse(txtProductPrice.Text);
newProduct.ProductType = (ProductTypeItem)oProductType;

dc.Product.InsertOnSubmit(newProduct);
dc.SubmitChanges();   

我唯一改变的是将 Product Type 初始化为Item而不是ProductTypeItem,然后将其转换为 ProductTypeItem 现在它可以工作了

于 2011-03-03T20:11:38.410 回答
0

LINQ to SharePoint 生成的代码与您的列表不同步。重新生成列表,它将起作用 -Paul Beck

于 2011-03-25T23:46:39.143 回答