【问题标题】:Concatenation of measurements in SQL Database with Linq使用 Linq 连接 SQL 数据库中的测量值
【发布时间】:2018-02-04 15:07:24
【问题描述】:

我正在为一家家具店开发一个网络系统,我想以这种方式显示家具的尺寸

问题是我的数据库中有不同列中的测量值

CombosBox 或 Dropdown 的调用我将它们作为对类的调用 (ComboHelps.cs)

public class CombosHelper : IDisposable
{   
    public static List<MuebleVanitorio> GetMedidas()
    {
        var medidas = db.MuebleVanitorios.Select(m => m.Largo + "" + m.Ancho + "" + m.Alto).ToList();
        medidas.Add(new MuebleVanitorio
        {
            Kn_CodigoMuebleVanitorio = 0,
            v_Nombre = "[Seleccione Medidas...]",
        });
        return medidas.OrderBy(m => m.v_Nombre).ToList();
    }
}

我的模特:

public class MuebleVanitorio
{
    [Key]
    public int Kn_CodigoMuebleVanitorio { get; set; }

    public string v_Nombre { get; set; }

    public int Largo { get; set; }

    public int Alto { get; set; }

    public int Ancho { get; set; }
}

我的控制器:

public ActionResult AgregarMuebleVanitorio()
{            
    ViewBag.Kn_CodigoMuebleVanitorio = new SelectList(CombosHelper.GetMedidas(), "Kn_CodigoMuebleVanitorio", "v_Nombre");

    return View();
}

我的观点:

 <div class="form-group">
            @Html.LabelFor(model => model.Kn_CodigoMuebleVanitorio, "Medidas Mueble", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("Kn_CodigoMuebleVanitorio", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Kn_CodigoMuebleVanitorio, "", new { @class = "text-danger" })
            </div>
        </div>

我收到以下错误:

“字符串”不包含“v_Nombre”的定义,并且找不到接受“字符串”类型的第一个参数的扩展方法“v_Nombre”

对我有什么帮助吗?

【问题讨论】:

    标签: c# asp.net-mvc linq combobox dropdown


    【解决方案1】:

    该语句右侧的表达式

    var medidas = db.MuebleVanitorios
                    .Select(m => m.Largo + "" + m.Ancho + "" + m.Alto)
                    .ToList();
    

    将返回一个字符串列表。这意味着,您的 medidas 变量是一个字符串列表。在下一行中,您尝试向其中添加一个MuebleVanitorio 对象。当您尝试将不同类型添加到字符串列表时,这应该会给您一个编译错误。

    要呈现下拉列表,您需要SelectListItemss 的列表。所以更新你的 GetMedidas 方法返回每个项目的 Value 将是 v_Nombre 列值,Text 将是通过连接 LargoAnchoAlto 属性值生成的字符串。

    public List<SelectListItem> GetMedidas()
    {
        return db.MuebleVanitorios
                        .Select(m => new SelectListItem { 
                                              Text=m.Largo + "X" + m.Ancho + "X" + m.Alto, 
                                              Value=m.v_Nombre})
                        .ToList();
    }
    

    并且在您的操作方法中,现在您不需要再次创建SelectList。可以直接赋值GetMedidas方法调用的结果(这是SelectListItem的列表

    ViewBag.Kn_CodigoMuebleVanitorio = CombosHelper.GetMedidas();
    

    此外,您似乎没有在 CombosHelper 类中实现 IDisposable 的方法。这也应该给你一个编译时错误

    你真的需要一个额外的类和静态方法吗?我建议你重新评估这个想法,看看你是否可以创建另一个可以注入(通过 DI)到你的类的数据助手,以便你的代码是可单元测试的。

    【讨论】:

    • 是的,我正在正确实现 IDisposable 接口,但我仍然没有成功,(“没有类型为 'IEnumerable ' 的 ViewData 项具有键 'Kn_CodigoMuebleVanitorio') ,我的 ComboHelpers.cs 帮助我恢复了我项目的所有下拉列表,但答案不一定来自这个类@Shyju
    • 只要您按照我的答案中的代码进行操作,它应该可以工作。我只是将它复制并粘贴到一个本地项目中(连同你在问题中的代码),它对我完全有用。
    • 这是非常罕见的,当我从下拉菜单所在的视图打开项目时,它可以工作,但是当我从 HomeController 打开项目并导航到有问题的视图时,系统在运行时,为什么会这样?
    • 试试这个。不要在您的操作方法中调用静态方法,而是复制该方法中的代码以分配视图包项 (ViewBag.Kn_CodigoMuebleVanitorio = db.MuebleVanitorios .Select( ... ).ToList();)
    • 探查你最后的推荐,它也不起作用,因为有可能从视图开始它有效,但在执行时它下降,很难进行这个查询?你向我推荐什么?我不能给出肯定的答案还是肯定的?
    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多