【问题标题】:Setting up linq to sql context将 linq 设置为 sql 上下文
【发布时间】:2014-02-17 15:31:44
【问题描述】:

我试图避免 3 部分连接,并且我想直接访问我的第三个表名称,但我是 linq to sql 的新手,我不确定我需要如何设置一切才能正常工作。我正在做但不想做的一个例子是:

from x in currentLogs
join y in cDataContext.CategoryCountryCategoryTypeMappings
on x.CategoryCountryCategoryTypeMappingID equals y.CategoryCountryCategoryTypeMappingID
join cat in cDataContext.Categories
on y.CategoryID equals cat.CategoryID
where x.Response != 0 && cat.StorefrontID==storeID
select x).Count();

我想做的是:

from x in currentLogs
join y in cDataContext.Categories
on x.CategoryCountryCategoryTypeMappingID equals y.CategoryCountryCategoryTypeMapping.CategoryCountryCategoryTypeMappingID
where x.Response != 0 && y.StorefrontID==storeID
select x).Count();

但是当我遇到错误

cat.CategoryCountryCategoryTypeMapping.CategoryCountryCategoryTypeMappingID

由我的自动生成的 dbml 返回,Sequence 不止一个实体。

我的布局看起来像:

DownloadLog 到 cccmapping 是一对一的,其他都是一对多的。我可能有点搞砸了,但是下载日志记录了一个 cccMapping,因为 cccmapping 有国家类别和类别类型的排列,每个排列都是唯一的。不确定这是否使映射表成为一对一或一对多。我是否设置了我的上下文权限来做我想做的事情?

【问题讨论】:

  • 为什么要避免 3 表连接?在无论如何都必须发生的场景下
  • 它可能很琐碎,但代码简单/可读。如果 cccMappings 有一个类别,并且该类别有一个名称,那么在代码中说 cccMappings.categories.select(...).Name 是有意义的
  • 你为什么不使用像Category.CategoryCountryCategoryTypeMappings这样应该在类模型中的导航属性呢?您可能根本不需要一个连接。

标签: c# sql linq


【解决方案1】:

根据您的设置,您似乎应该能够使用导航属性。所以按照这些思路应该可以工作。

currentLogs
    .Where(log => log.Response != 0 && 
        log.CategoryCountryCategoryTypeMappings
            .Any(map => map.Categories
                .Any(cat => cat.StoreFrontID == storeID))).Count();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多