3

我正在尝试Catalog使用流利的 linq 获取当前未映射到购物车的所有对象。映射表cart_catalog_mapping由 EF 生成。我使用以下域对象。

购物车(删除了与问题无关的评论和额外字段

public partial class Cart : BaseEntity, ILocalizedEntity
    {

        public virtual string Name { get; set; }

        public virtual DateTime OpeningDateUtc { get; set; }

        public virtual DateTime ClosingDateUtc { get; set; }

        public virtual bool IsReadonly { get; set; }

        public virtual bool IsPreviewMode { get; set; }

        public virtual CustomerRole CustomerType { get; set; }

        public virtual ICollection<Catalog> Catalogs { get; set; }

    }

目录(再次删除了与问题无关的评论和额外字段)

public partial class Catalog : BaseEntity, ILocalizedEntity
    {
        public virtual string Name { get; set; }

        public virtual string Code { get; set; }

        public virtual bool Published { get; set; }

        public virtual int DisplayOrder { get; set; }
    }

带代码的 EF5 首先创建购物车和目录表。它还识别出 Cart 具有列表并创建一个 cart_catalog_mapping 表。我正在尝试获取Catalog表中没有引用的所有行cart_catalog_mapping。我设想的 SQL 是

SELECT * FROM Catalog WHERE Catalog.Id NOT IN (SELECT Catalog_Id FROM cart_catalog_mapping)

我尝试使用的流利的 linq 如下: public IList GetAllUnassociatedCatalogs() { IRepository _catalogRepository; IRepository _cartRepository;

    var query = from catalog in _catalogRepository.Table
                    from cart in _cartRepository.Table
                    where !cart.Catalogs.Contains(catalog)
                    select catalog;

    return query.ToList();

}

不幸的是,返回的 IList 没有元素。(目前 cart 或 cart_catalog_mapping 表中没有行,catalog 表中有 3 行)

差点忘了,映射表

public partial class CartMap : EntityTypeConfiguration<Cart>
    {
        public CartMap()
        {
            this.ToTable("Cart");
            this.HasKey(c => c.Id);
            this.Property(c => c.Name).IsRequired().HasMaxLength(100);
            this.Property(c => c.IsOnline).IsRequired();

            this.HasMany(c => c.Catalogs)
                .WithMany()
                .Map(m => m.ToTable("Cart_Catalog_Mapping"));
        }
    }

public partial class CatalogMap : EntityTypeConfiguration<Catalog>
    {
        public CatalogMap()
        {
            this.ToTable("Catalog");
            this.HasKey(c => c.Id);
            this.Property(c => c.Name).IsRequired().HasMaxLength(100);
        }

    }
4

2 回答 2

2

从您的示例中,我假设 Cart 和 Catalog 是多对多的。在这种情况下,您是否也可以在 Catalog 对象上放置一个 ICollection 的 Carts ?如果你能做到这一点,那么你需要做的就是:

var query = catalogRepository.Any(catalog => catalog.Carts.Any());
return query.ToList();

或者,如果您不喜欢使用扩展方法,您可以按照@hvd 的建议进行操作。

于 2012-12-28T16:14:05.957 回答
0

您也可以尝试转换为 LEFT JOIN .. WHERE join 为空:

var query = from catalog in Catalog.Table
            join cart in CartMap.Table on catalog.Id equals cart.Catalog_Id into map
            from cm in map.DefaultIfEmpty()
            where cm equals null
            select catalog;
于 2013-01-03T08:44:48.417 回答