LINQ to SQL - 数据库设计问题

时间:2012-12-01 10:19:29

标签: c# sql-server linq linq-to-sql

我对一般的数据库工作很陌生,并希望得到关于出了什么问题的指导。

我手边有4张桌子,目前以这种方式设置:

enter image description here

公司 - 只是包含特定数据的普通公司表

Company_GoodsPackaging - 公司的参考表,其中包含公司“做”的商品类型以及该商品的包装类型的信息。

GoodsType - 基本上是枚举,现在的值是:

  

1商品

     

2食物/饲料

     

3只活体动物

     

4种植物

     

5特殊货物

     

6例外

PackagingType - 也是枚举,值:

  

1包

     

2托盘

     

3个容器

     

4 Bulk

     

5超大

CODE

在我的ASP.NET网站的代码隐藏中,我正在执行以下操作:

我遍历所有GoodsType值,并尝试查看CompanyX(LINQ公司对象)是否在其表中具有此值,如果是,那么该值的Packaging_Type.Description是什么。

我现在遇到的问题是,当我拥有公司对象时,我似乎无法提取其成员。

var theSource = (from g in Data.GoodsTypes
select new
{
  gvGoodsType = g.Description,
  gvParcels = true,
  gvContainers = curCompany.Company_GoodsPackagings.GoodsType == g.Goods_Type &&
  curCompany.Company_GoodsPackagings.PackagingType1.Description == "Container"
}

关系已经完成,一切似乎都是正确的,但我似乎无法提取Company_GoodsPackaging条目的GoodsType和PackagingType。我知道这是一个EntitySet。

我的DataBase设计存在缺陷/代码逻辑存在缺陷?我不得不说,我非常擅长在DataBases中工作。任何帮助/意见都会受到欢迎。

错误我进入VS是

  

错误26'System.Data.Linq.EntitySet'不包含'GoodsType'的定义,并且没有可以找到接受类型'System.Data.Linq.EntitySet'的第一个参数的扩展方法'GoodsType'(是你错过了using指令或程序集引用?)***** \ Account \ MyAccountTransport.aspx.cs 33 8

2 个答案:

答案 0 :(得分:2)

如果我没弄错,公司 - > Company_GoodsPackagings是一对多的关系?

因此属性Copmany_GoodsPackagings将是一个集合,因此您需要使用Any()函数,如下所示:

var theSource = (from g in Data.GoodsTypes
select new
{
  gvGoodsType = g.Description,
  gvParcels = true,
  gvContainers = curCompany.Company_GoodsPackagings.Any(gp => qp.GoodsType == g.Goods_Type && gp.PackagingType1.Description == "Container")
}

编辑:Linq to SQL似乎不支持我使用Any()的建议。因此,我建议您带回整个商品包装对象,然后检查它是否有值,以确定布尔gvContainers:

然后,您可以将您的匿名类型转换为具体类,并在示例的末尾添加该属性:

var theSource = (from g in Data.GoodsTypes
select new GoodsResult
{
  gvGoodsType = g.Description,
  gvParcels = true,
  gvGoodsPackaging_Container = curCompany.Company_GoodsPackagings.FirstOrDefault(gp => qp.GoodsType == g.Goods_Type && gp.PackagingType1.Description == "Container")
}

public bool gvContainers {
    get { return this.gvGoodsPackaging != null }
}

答案 1 :(得分:2)

问题是curCompany.Company_GoodsPackagings是GoodsPackagings的集合(因此是复数并提及System.Data.Linq.EntitySet)。因此,您不能以这种方式直接引用公司的单个GoodsType。

我认为您正在寻找一种方法来根据您的条件测试公司的每一件商品包装。为此,您可以使用Any() Linq扩展方法:

using System.Linq;

...

gvContainers = curCompany.Company_GoodsPackagings.Any(gp => gp.GoodsType ==
   g.Goods_Type && gp.PackagingType1.Description == "Container")