Приведение значения, созданного в объекте LINQ - PullRequest
0 голосов
/ 08 декабря 2018

Я получаю список выбранных элементов на DataGrid, как это.

using (REntities RAEntity = new REntities())
{
    var all = RAEntity.TBLM_PRODUCT.ToList<DataControllers.TBLM_PRODUCT>();
    var selectionList = all.Where(x => x.PRODUCT_PROGROUP == "GL").Select(p => new { p.PRODUCT_DESC, p.PRODUCT_SPRICE }).ToList();

    bs.DataSource = selectionList;
    dg.DataSource = bs;
}

И на выбор DataGridView, одним нажатием кнопки я получаю значение для моего TextBox в другой форме.как это.

if (window.ShowDialog() == DialogResult.OK)
{    
    selectedProduct = (DataControllers.TBLM_PRODUCT)bs.Current;
    txtServiceType.Text = selectedProduct.PRODUCT_DESC.ToString();

Мой выбранный продукт объявляется так:

public partial class TBLM_PRODUCT
{           
    public string PRODUCT_CODE { get; set; }
    public string PRODUCT_DESC { get; set; }
    public string PRODUCT_ISBN { get; set; }
    public string PRODUCT_SUPPLIER { get; set; }
    public string PRODUCT_PROGROUP { get; set; }
    public Nullable<decimal> PRODUCT_SPRICE { get; set; }
}

private TBLM_PRODUCT selectedProduct;

Когда я пытаюсь получить данные в TextBox другой формы, отображается неверная ошибка приведения, например:

Невозможно привести объект типа '<> f__AnonymousType0 2[System.String,System.Nullable 1 [System.Decimal]]' к типу TBLM_PRODUCT '.

Как это преодолеть?как выполнить приведение, когда я передаю данные объекту или как получить данные для следующей формы?

1 Ответ

0 голосов
/ 08 декабря 2018

С этим Select(p => new { p.PRODUCT_DESC, p.PRODUCT_SPRICE }) вы фактически возвращаете список анонимного типа вместо списка TBLM_PRODUCT.Измените свой код следующим образом:

p => new TBLM_PRODUCT {PRODUCT_DESC = p.PRODUCT_DESC, PRODUCT_SPRICE = p.PRODUCT_SPRICE } 

И если вы все еще получаете ошибку, вероятно, это потому, что вы не можете проецировать на сопоставленную сущность, тогда вам нужно создать класс DTO с необходимыми свойствами из сущности TBLM_PRODUCT,что-то вроде этого:

public class TBLM_PRODUCTDTO
{
    public string PRODUCT_DESC { get; set; }
    public Nullable<decimal> PRODUCT_SPRICE { get; set; }
    //Other Properties
}

А затем используйте этот DTO следующим образом:

p => new TBLM_PRODUCTDTO {PRODUCT_DESC = p.PRODUCT_DESC, PRODUCT_SPRICE = p.PRODUCT_SPRICE } 

И:

private TBLM_PRODUCTDTO selectedProduct;
selectedProduct = (TBLM_PRODUCTDTO) bs.Current;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...