LINQ to Sharepoint InsertOnSubmit问题

时间:2011-03-02 22:17:52

标签: c# linq sharepoint linq-to-sharepoint

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

  • ProductName是一个字符串
  • ProductPrice是货币(双倍)
  • ProductType是ProductTypes列表上的LookUp

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

我曾尝试过这个,但它返回错误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数据源是 ProductType列表,并在TitleDataTextField

中使用DataValueField

5 个答案:

答案 0 :(得分:1)

This可能会帮助你。第一个示例说明了插入应如何与现有数据的链接一起使用。此示例代码应该为您提供足够的提示,以帮助您解决问题:

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

答案 1 :(得分:0)

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

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

这意味着您需要访问ListID查询中的查找值ProductTypes

答案 2 :(得分: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();

希望这有帮助

答案 3 :(得分: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();   

我唯一更改的是将产品类型初始化为 Item 而不是 ProductTypeItem ,然后将其转换为ProductTypeItem作品

答案 4 :(得分:0)

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