C# Net MVC根据另一个表中的设置显示索引列表

C# Net MVC根据另一个表中的设置显示索引列表,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个索引页面,显示当前价格的零件列表。我需要的是把售价乘以任何设定值。不同的商品有不同的价格范围。我需要做的是获取零件号的起始字母,并将其与设置中的列表进行比较 例如,当检索到A01282零件时,我需要获取第一个字母,并将其与值进行比较 在我的控制器中,到目前为止我已经有了这一点,但是我不知道如何比较这两个。我在获取零件号时也遇到问题。它是说它不存在于IEnumerable中 这是我的控制器到目前为止的动作 public ActionResult Index(Guid id) { v

我有一个索引页面,显示当前价格的零件列表。我需要的是把售价乘以任何设定值。不同的商品有不同的价格范围。我需要做的是获取
零件号的起始字母
,并将其与设置中的列表进行比较

例如,当检索到A01282零件时,我需要获取第一个字母,并将其与值进行比较

在我的控制器中,到目前为止我已经有了这一点,但是我不知道如何比较这两个。我在获取零件号时也遇到问题。它是说它不存在于
IEnumerable

这是我的控制器到目前为止的动作

public ActionResult Index(Guid id)
{
    var productMaster = db.ProductMaster.Include(p => p.Parts).Include(p => p.Vendor);
    var prodData = db.Parts.Include(n => n.PartNumber);
    var Billsettings = db.BillingSettings.Where(t => t.Types == 1).OrderByDescending(m => m.StartingValues).FirstOrDefault();


    return View(productMaster.ToList().Where(m => m.Material == id));
}
因此,在
var Billingsettings
之后,我将放置一个
if
语句来进行比较

对于与设置中的起始字母匹配的每个
零件号
,将获得
ProductMaster
中的
AverageCost
乘以售价的设置值

如果有人能帮我指出正确的方向那就太好了

提前谢谢

更新: 模型类:

public class ProductMaster
{
    [Key]
    public Guid ProductMasterId { get; set; }
    public Guid VendorId { get; set; }
    public Guid Material { get; set; }
    public string VendorRef { get; set; }
    public DateTime? CreatedDate { get; set; }

    public string CreatedBy { get; set; }

    public DateTime? LastUpdated { get; set; }

    public string UpdatedBy { get; set; }

    [Display(Name = "UOM")]
    public string UnitOfMeasure { get; set; }
    //[Display(Name = "Sell Price")]
    //public decimal SellingPrice { get; set; }
    [Display(Name = "Cost")]
    public decimal StandardCost { get; set; }
    [Display(Name = "Avg Cost")]
    public decimal AverageCost { get; set; }
    [Display(Name = "Last Cost")]
    public decimal LastCost { get; set; }
    public bool IsPrimary { get; set; }
    public string LeadTime { get; set; }

    public Vendors Vendor { get; set; }
    public Parts Parts { get; set; }
}

以下是设置表:

更新:我将表中的
Value
列更改为
Money
。所以他们现在是正确的

更新:为了遵循下面给出的内容,我做了以下更改。 但是,它不起作用。
(x.Key))
之后的
“?”
给出以下错误:

运算符“?”不能应用于类型为的Opera “KeyVAluePair”

以下是我所拥有的:

public ActionResult Index(Guid id)
{
    //var productMaster = db.ProductMaster.Include(p => p.Parts).Include(p => p.Vendor);

    var dict = db.BillingSettings.Where(t => t.Types == 1).ToDictionary(x => x.StartingValues, x => x.Value);

    var price = db.Parts.Include(n => n.ProdMaster).ToList().Where(m => m.Material == id).Select(n => {
        n.SellingPrice = n.ProdMaster.AverageCost * (dict.FirstOrDefault(x => n.PartNumber.StartsWith(x.Key))?.Value ?? 1);
        //return n;
    });

    //return View(productMaster.ToList().Where(m => m.Material == id));
    return View(price);
}
更新:仍然有点坚持这个。我需要它来返回Guid为的视图。虽然下面的答案很有帮助,但它也让我困惑,不知道我应该如何处理它。把它放在模型里?从控制器调用模型

以下是我的零件型号:

public class Parts
{
    [Key]
    [Display(Name = "Part")]
    public Guid Material { get; set; }
    [Display(Name = "Drawing")]
    public string DrawingNumber { get; set; }
    public string Description { get; set; }
    [Display(Name = "Extended")]
    public string ExtDescription { get; set; }

    [Display(Name = "Image")]
    public string PartImage { get; set; }

    public bool ShowPrice { get; set; }
    public string PartNumber { get; set; }

    [Display(Name = "Stock")]
    public int? UnitsInStock { get; set; }
    public bool? Status { get; set; }

    public DateTime? CreatedDate { get; set; }

    public string CreatedBy { get; set; }

    public DateTime? UpdatedDate { get; set; }

    public string UpdatedBy { get; set; }

    public bool? IsDelete { get; set; }

    //public virtual ProductMaster ProdMaster { get; set; }

    public virtual List<OrderDetail> OrderDetails { get; set; }
}
我收到的错误是:

方法“Queryable.Select(IQueryable,Expression>)的类型参数” 无法从用法推断。尝试指定类型参数 明确地说

更新: 由于我无法理解这一点,而且似乎没有其他人能够理解这一点,因此我更改了格式,使用存储过程为我自动计算销售价格-点击按钮并更新。以及构建视图—所有服务器端SQL

我仍然需要一些工作,但这是一个开始。它可以工作,但不漂亮

SELECT pm.[ProductMasterId]
  ,pm.[Material]
  ,pm.[UnitOfMeasure]
  ,pm.[StandardCost]
  ,pm.[AverageCost]
  ,pm.[LastCost]
  ,pm.[IsPrimary]
  ,pm.[LeadTime]
  ,CASE
    WHEN priceMatch.[Value] IS NOT NULL
    THEN pm.LastCost * priceMatch.[Value]
    ELSE pm.LastCost * (SELECT TOP 1 [Value] FROM [dbo].[BillingSettings] WHERE [Types] = 1 AND [StartingValues] IS NULL)
    END AS [SellingPrice]
  ,p.[PartNumber]
  FROM [dbo].[ProductMaster] pm
  INNER JOIN [dbo].[Parts] p
  ON pm.[Material] = p.Material
  LEFT JOIN (SELECT [StartingValues]
              ,[Value]
          FROM [dbo].[BillingSettings]
          WHERE [Types] = 1
          AND [StartingValues] IS NOT NULL) AS priceMatch
  ON SUBSTRING(p.PartNumber, 1, 1) = priceMatch.[StartingValues]
所以你需要的是

首先,使用

var dict = db.BillingSettings.Where(t => t.Types == 1).ToDictionary(x => x.StartingValue, x => x.Value)
然后,在选择零件时,进行比较

db.Parts.Include(n => n.ProductMaster).ToList().Select(n => {
    n.SellingPrice = n.ProductMaster.AverageCost * (dict.FirstOrDefault(x => n.PartNumber.StartsWith(x.Key))?.Value ?? 1);
    return n;
});
更新:

class Program
{
    static void Main(string[] args)
    {
        var dbContext = new FakeDbContext();

        var lookup = dbContext.BillingSettings.Where(t => t.Types == 1).Select(s => new
        {
            s.StartingValues,
            s.Value
        });

        var price = dbContext.Parts
            //.Include(n => n.ProdMaster).ToList() // this will work with real EF DbContext
            //.Where(m => m.Material == id) // this will work with real EF DbContext
            .Select(n =>
            {
                n.SellingPrice = n.ProductMaster.AverageCost * (lookup.FirstOrDefault(x => n.PartNumber.StartsWith(x.StartingValues))?.Value ?? 1);
                return n;
            });

        Console.ReadKey();
    }
}

public class FakeDbContext
{
    public List<Part> Parts { get; set; }
    public List<BillingSettings> BillingSettings { get; set; }
}

public class ProductMaster
{
    public decimal AverageCost { get; set; }
}

public class Part
{
    public ProductMaster ProductMaster { get; set; }
    public decimal SellingPrice { get; set; }
    public string PartNumber { get; set; }
}

public class BillingSettings
{
    public int Types { get; set; }
    public string StartingValues { get; set; }
    public decimal Value { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
var dbContext=new FakeDbContext();
var lookup=dbContext.BillingSettings.Where(t=>t.Types==1)。选择(s=>new
{
s、 起始值,
s、 价值观
});
var price=dbContext.Parts
//.Include(n=>n.ProdMaster).ToList()//这将适用于real EF DbContext
//.Where(m=>m.Material==id)//这将适用于real EF DbContext
.选择(n=>
{
n、 SellingPrice=n.ProductMaster.AverageCost*(lookup.FirstOrDefault(x=>n.PartNumber.StartsWith(x.StartingValues))?.Value??1);
返回n;
});
Console.ReadKey();
}
}
公共类FakeDbContext
{
公共列表部分{get;set;}
公共列表计费设置{get;set;}
}
公共类ProductMaster
{
公共十进制平均成本{get;set;}
}
公共课部分
{
公共ProductMaster ProductMaster{get;set;}
公共十进制SellingPrice{get;set;}
公共字符串零件号{get;set;}
}
公共类计费设置
{
公共int类型{get;set;}
公共字符串起始值{get;set;}
公共十进制值{get;set;}
}

如果您发布有问题的POCO模型类,可能会有所帮助。谢谢您的评论。欢迎来到这个网站!所以零件不包含ProductMaster,并且我在模型中没有销售价格。那么我应该把它放在ViewModel中并添加我需要的内容吗?还有,我正在使用这个,并且正在抓取控制器中当前的内容?还有一些其他的东西。(x.Key)后面的“?”表示不能与类型“KeyValuePAir”一起使用。我仍然需要返回material==id的列表。如果您可以添加您的零件模型,那么我可以提供帮助。因为在您的LinQ中,有来自零件型号的SellingPrice.:)我可能误解了你的模型我刚刚添加了一个更新。我改为不再使用字典,而是使用动态类型。但希望您了解如何使用1个列表在另一个列表中查找。我将BillingSettings添加到零件模型中。然而,我认为这会给我带来其他问题。您能否实现我将如何使用返回视图的控制器中的内容??或者它是否像用返回视图(价格)替换Console.ReadKey一样简单;谢谢
db.Parts.Include(n => n.ProductMaster).ToList().Select(n => {
    n.SellingPrice = n.ProductMaster.AverageCost * (dict.FirstOrDefault(x => n.PartNumber.StartsWith(x.Key))?.Value ?? 1);
    return n;
});
class Program
{
    static void Main(string[] args)
    {
        var dbContext = new FakeDbContext();

        var lookup = dbContext.BillingSettings.Where(t => t.Types == 1).Select(s => new
        {
            s.StartingValues,
            s.Value
        });

        var price = dbContext.Parts
            //.Include(n => n.ProdMaster).ToList() // this will work with real EF DbContext
            //.Where(m => m.Material == id) // this will work with real EF DbContext
            .Select(n =>
            {
                n.SellingPrice = n.ProductMaster.AverageCost * (lookup.FirstOrDefault(x => n.PartNumber.StartsWith(x.StartingValues))?.Value ?? 1);
                return n;
            });

        Console.ReadKey();
    }
}

public class FakeDbContext
{
    public List<Part> Parts { get; set; }
    public List<BillingSettings> BillingSettings { get; set; }
}

public class ProductMaster
{
    public decimal AverageCost { get; set; }
}

public class Part
{
    public ProductMaster ProductMaster { get; set; }
    public decimal SellingPrice { get; set; }
    public string PartNumber { get; set; }
}

public class BillingSettings
{
    public int Types { get; set; }
    public string StartingValues { get; set; }
    public decimal Value { get; set; }
}