实体框架。如何在没有主键

时间:2016-10-25 09:55:06

标签: c# entity-framework linq

I tried to solve this problem, but couldn't所以我试图以另一种方式去做。

我有一个由3个表组成的视图,没有任何主键/外键。

VS2015生成了这个类:

[Table("SkuBarcodesView")]
public partial class SkuBarcodesView
{
    [Key]
    [Column("_Code", Order = 0)]
    [StringLength(11)]
    public string C_Code { get; set; }

    [Key]
    [Column("_Description", Order = 1)]
    [StringLength(150)]
    public string C_Description { get; set; }

    [Key]
    [Column("_ProductCode", Order = 2)]
    [StringLength(50)]
    public string C_ProductCode { get; set; }

    [Key]
    [Column("_Ref", Order = 4)]
    [StringLength(36)]
    public string C_Ref { get; set; }

    [Key]
    [Column("_Barcode", Order = 5)]
    public string C_Barcode { get; set; }
}

这个实体代表sku-barcode表,所以我可能有这样的行:

 Product  | Barcode
 -------- | --------
 product0 | barcode0
 product1 | barcode1 
 product2 | barcode2
 product2 | barcode2

现在,我需要以某种方式对其进行分组。我正在尝试:

using (skumodel db = new skumodel())
{
    var query = db.SkuBarcodesViews.GroupBy(e => e.C_Ref)
        .Select(g => new { Barcode = g.C_Barcode });
}

但是,我看到了这个错误:

  

严重级代码描述项目文件行抑制状态

     

错误CS1061' IGrouping'不包含' C_Barcode'的定义没有扩展方法' C_Barcode'接受第一个类型' IGrouping'可以找到(你错过了使用指令或程序集引用吗?)

我该如何解决这个问题?

这只是一个开始;数据库中有很多其他表没有我希望通过EF使用的键/外键。

从没有密钥的表中获取数据的正确方法是什么?如何映射这些表?

1 个答案:

答案 0 :(得分:0)

首先,这本身并不是主要/外键问题。 LINQ分组的工作方式与通常的SQL分组不同,但更像是Dictionary。对于您的示例,对于表中的每个出现,具有键product2的组将具有两个值barcode2。当我们在C#中使用对象时,每一行都由SkuBarcodesView实例表示,所以如果你想得到产品的所有条形码,你需要这样的东西:

using (skumodel db = new skumodel())
{
    var query = db.SkuBarcodesViews.GroupBy(e => e.C_Ref)
        .Select(g => new { 
                             Product = g.Key,
                             Barcodes = g.Select(x => x.C_Barcode) 
               });
}

注意,目前对表中的值没有限制,因此一个产品可能有很多不同的条形码或许多相同的条形码等。您如何判断哪一个是正确的?当然,如果您确定只有类似的条形码,您可以在上面的代码中执行g.First().C_Barcode而不是内部g.Select()来获取单个条形码。

其次,在这里使用GroupBy()是一种矫枉过正,你可以使用类似的东西:

using (skumodel db = new skumodel())
{
    var query = db.SkuBarcodesViews
        .Select(x => new { Ref = x.C_Ref, Barcode = x.C_Barcode })
        .Distinct();
}