わかりましたみんな(そしてギャル)、これは一晩中私を狂わせていました、そして私はあなたの集合的な知恵に助けを求めています.
データ アクセス ストーリーとして Fluent Nhibernate と Linq-To-NHibernate を使用しており、次の単純化された DB 構造があります。
CREATE TABLE [dbo].[Classes](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](100) NOT NULL,
[StartDate] [datetime2](7) NOT NULL,
[EndDate] [datetime2](7) NOT NULL,
CONSTRAINT [PK_Classes] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
CREATE TABLE [dbo].[Sections](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[ClassId] [bigint] NOT NULL,
[InternalCode] [varchar](10) NOT NULL,
CONSTRAINT [PK_Sections] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
CREATE TABLE [dbo].[SectionStudents](
[SectionId] [bigint] NOT NULL,
[UserId] [uniqueidentifier] NOT NULL,
CONSTRAINT [PK_SectionStudents] PRIMARY KEY CLUSTERED
(
[SectionId] ASC,
[UserId] ASC
)
CREATE TABLE [dbo].[aspnet_Users](
[ApplicationId] [uniqueidentifier] NOT NULL,
[UserId] [uniqueidentifier] NOT NULL,
[UserName] [nvarchar](256) NOT NULL,
[LoweredUserName] [nvarchar](256) NOT NULL,
[MobileAlias] [nvarchar](16) NULL,
[IsAnonymous] [bit] NOT NULL,
[LastActivityDate] [datetime] NOT NULL,
PRIMARY KEY NONCLUSTERED
(
[UserId] ASC
)
簡潔にするために外部キーは省略しましたが、基本的には次のようになります。
- クラスは多くのセクションを持つことができます。
- セクションは 1 つのクラスのみに属することができますが、多くの生徒を持つことができます。
- 学生 (aspnet_Users) は、多くのセクションに所属できます。
対応する Model クラスと Fluent NHibernate Mapping クラスをセットアップしましたが、すべて正常に動作しています。
ここで私は立ち往生しています。学生の UserId とクラスの日付に基づいて、学生が登録されているセクションを返すクエリを作成する必要があります。
これが私がこれまでに試したことです:
1.
var sections = (from s in this.Session.Linq<Sections>()
where s.Class.StartDate <= DateTime.UtcNow
&& s.Class.EndDate > DateTime.UtcNow
&& s.Students.First(f => f.UserId == userId) != null
select s);
2.
var sections = (from s in this.Session.Linq<Sections>()
where s.Class.StartDate <= DateTime.UtcNow
&& s.Class.EndDate > DateTime.UtcNow
&& s.Students.Where(w => w.UserId == userId).FirstOrDefault().Id == userId
select s);
明らかに、開始日と終了日の間に現在の日付のクラスの userId に一致する学生がいない場合、上記の 2 は惨めに失敗します...しかし、試してみたかっただけです。
Class StartDate と EndDate のフィルターは正常に機能しますが、Students との多対多の関係は難しいことがわかっています。クエリを実行しようとするたびに、次のメッセージとともに ArgumentNullException が発生します。
値を null にすることはできません。パラメータ名:セッション
私は多対多ではなく、Section への参照と Student への参照を使用して、SectionStudents リレーションを Model クラスにする道をたどることを検討しました。できればそれを避けたいのですが、そのように機能するかどうかさえわかりません。
助けていただける方、よろしくお願いします。
ライアン