转换在LINQ对象中创建的值

时间:2018-12-08 07:02:25

标签: c# .net linq casting

我正在这样从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 :(得分:5)

使用此Select(p => new { p.PRODUCT_DESC, p.PRODUCT_SPRICE }),您实际上返回的是anonymous type的列表,而不是TBLM_PRODUCT的列表。将您的代码更改为此:

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

如果仍然出现错误,可能是因为无法投影到映射的实体,则需要使用TBLM_PRODUCT实体创建具有所需属性的DTO类,如下所示:

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;