【问题标题】:how to use string variable as column name in asp.net mvc如何在asp.net mvc中使用字符串变量作为列名
【发布时间】:2017-04-26 11:41:18
【问题描述】:

我不确定这样的事情是否可能。但我想使用一个变量作为列名。

下面是我必须使用的代码

cartall.CartItems = cartdatas.Select(a => new Models.DTO.CartDTO.CartVM()
{
    VariationId = a.VariationId,
    ColorName = a.ColorName,
    StockInfo = rpstock.FirstOrDefault(x => x.Id == a.VariationId).Yellow
}).ToList();

但我想像下面这样使用它。

我要使用的代码:

cartall.CartItems = cartdatas.Select(a => new Models.DTO.CartDTO.CartVM()
{
    VariationId = a.VariationId,
    ColorName = a.ColorName,
    StockInfo = rpstock.FirstOrDefault(x => x.Id == a.VariationId).(a.ColorName)
}).ToList();

我的 Stock.cs

public class Stock:Base.BaseEntity
{
    public int Id { get; set; }
    public int? Yellow { get; set; }
    public int? Red { get; set; }
    public int? White { get; set; }

    public virtual VariationEntity.Variation Variation { get; set; }
}

我的 Variation.cs

public class Variation : Base.BaseEntity
{
    public int Id { get; set; }
    public int OwnerProductID { get; set; }
    public string SKU { get; set; }
    public short? Height { get; set; }
    public short? Width { get; set; }
    public decimal? Price { get; set; }
    public string Delivery { get; set; }
    public int? OrderLimit { get; set; }

    public virtual StockEntity.Stock Stock { get; set; }
}

stock.cs 和variation.cs 之间存在一对一的关系

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework variables


    【解决方案1】:

    这应该可行:

     StockInfo = rpstock.FirstOrDefault(x => x.Id == a.VariationId && x.ColorName == a.ColorName)
    

    【讨论】:

    • 这行不通。因为“ColorName”不是一列。我将颜色定义为列。
    • 那么我想我需要更多代码来查看您的数据类型是如何布局的。
    • 随着您的更新,很明显,您想要的内容不可能内联。您将需要在 cartdata.Select-statement 周围使用黄色、红色和白色的 switch-statement 并复制每种颜色的代码。这是因为您的代码内部不知道黄色、红色和白色。就代码而言,它们只是成员名称。
    • 感谢 Bob,我决定更改 stock 表的结构。这将是困难的,但从长远来看会更有用。我将创建一个颜色表,在库存表中会有颜色名称、数量列。然后我可以轻松访问所有内容
    • 确实,这会更通用。很高兴您自己发现了设计问题。
    【解决方案2】:

    我创建了一个Method,它将采用list 和一个Column Name,然后返回该列的value。请检查这个。

    代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public class Program
    {
        public class Stock
        {
            public int Id { get; set; }
            public int? Yellow { get; set; }
            public int? Red { get; set; }
            public int? White { get; set; }
        }
    
        public static void Main()
        {
            List<Stock> list = new List<Stock>();
            list.Add(new Stock(){Id=1, Yellow = 50, Red = 0, White = 205});
            list.Add(new Stock(){Id=2, Yellow = 20, Red = 200, White = 35});
            list.Add(new Stock(){Id=3, Yellow = 0, Red = 100, White = 155});
    
            string ColumnName = "Yellow";
    
            var Test1 = GetColumnValue(list.Where(m=>m.Id == 1).ToList(), ColumnName);
            var Test2 = GetColumnValue(list.Where(m=>m.Id == 2).ToList(), ColumnName);
            var Test3 = GetColumnValue(list.Where(m=>m.Id == 3).ToList(), ColumnName);
    
            Console.WriteLine(Test1);
            Console.WriteLine(Test2);
            Console.WriteLine(Test3);
        }
    
        public static object GetColumnValue(List<Stock> items, string columnName)
        {
            var values = items.Select(x => x.GetType().GetProperty(columnName).GetValue(x)).FirstOrDefault();
            return values;
        }
    }
    

    您必须在代码中使用GetColumnValue 方法,如下所示:

    cartall.CartItems = cartdatas.Select(a => new Models.DTO.CartDTO.CartVM()
    {
        VariationId = a.VariationId,
        ColorName = a.ColorName,
        StockInfo = GetColumnValue(rpstock.FirstOrDefault(x => x.Id == a.VariationId).ToList(), a.ColorName)
    }).ToList();
    

    您可以在DotNetFiddle 中运行此解决方案。

    【讨论】:

    • 恕我直言,你错过了标签entity-framework。您的代码对于 linq to object 运行良好,但对于 linq to entity 则不行。
    • 感谢您的回答。它工作得很好,但我会改变表格的结构,它会更有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多