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 と Catalog テーブルを作成します。また、カートにリストがあることを認識し、cart_catalog_mapping テーブルを作成します。Catalogテーブルに参照がないテーブル内のすべての行を取得しようとしていcart_catalog_mappingます。私が思い描いているSQLは

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

これらを取得するために使用しようとした流暢な linq は次のとおりです。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

あなたの例から、カートとカタログは多対多であると想定しています。その場合、カタログ オブジェクトにカートの ICollection を配置することもできませんか? それができれば、あなたがする必要があるのは次のことだけです。

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

または、拡張メソッドを使用しない場合は、@hvd が提案したように実行できます。

于 2012-12-28T16:14:05.957 に答える
0

LEFT JOIN .. WHERE join が null に変換することもできます。

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 に答える