LINQ to Sharepoint InsertOnSubmit Вопрос - PullRequest
2 голосов
/ 03 марта 2011

Например, у меня есть список с названием «Продукт», который состоит из 3 столбцов: «ProductName» (название), «ProductPrice» и «ProductType».

  • ProductName представляет собой строку
  • ProductPrice - это валюта (двойная)
  • ProductType - это поиск в списке ProductTypes

Обычно это легко для меня, если в нем нет столбца 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 является Список типов продуктов , который использует Title в своих DataTextField и DataValueField

Ответы [ 5 ]

1 голос
/ 03 марта 2011

Это может вам помочь.Первый пример объясняет, как вставка должна работать со ссылками на существующие данные.Этот пример кода должен дать вам достаточно советов, чтобы помочь вам решить вашу проблему:

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();
0 голосов
/ 26 марта 2011

Сгенерированный код LINQ to SharePoint не синхронизирован с вашим списком. Повторно сгенерируйте список, и он будет работать -Paul Beck

0 голосов
/ 03 марта 2011

Работает сейчас и вот решение

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, теперь он работает

0 голосов
/ 03 марта 2011

То, как вы делаете, мне кажется правильным.Так же, как я делал это с успехом.Вы уверены, что проблема в поисковой колонке?Является ли double правильным типом для валюты?Часто валюта сохраняется в виде десятичной дроби, а не двойной.

Кстати, вам не нужно получать Entitylist отдельно.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();

Надеюсь, это поможет

0 голосов
/ 03 марта 2011

Я не знаком с Linq to SharePoint , но я предполагаю, что это похоже на модель клиентских объектов. Если это так, вам нужно будет использовать FieldLookupValue для значения newProduct.ProductType и использовать ID поиска в качестве значения:

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

Это означает, что вам потребуется доступ к значению поиска ListID в вашем запросе ProductTypes.

...