0

わかりましたみんな(そしてギャル)、これは一晩中私を狂わせていました、そして私はあなたの集合的な知恵に助けを求めています.

データ アクセス ストーリーとして 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 クラスにする道をたどることを検討しました。できればそれを避けたいのですが、そのように機能するかどうかさえわかりません。

助けていただける方、よろしくお願いします。

ライアン

4

1 に答える 1

0

気にする人にとっては、Linq-To-NHibernate がサブクエリをサポートできる場合 (または、私は完全にオフベースである可能性があり、これは Linq-To で使用される Criteria API の制限である可能性があります)、次のように将来的に機能するように見えます-NHibernate):

var sections = (from s in session.Linq<Section>()
where s.Class.StartDate <= DateTime.UtcNow
&& s.Class.EndDate > DateTime.UtcNow
&& s.Students.First(f => f.UserId == userId) != null
select s);

ただし、現在、このクエリを実行すると、LINQPad で次の例外が発生します。

プロジェクションのない基準でサブクエリを使用することはできません。

とりあえず、これを2つの操作に分けました。最初に生徒と対応するセクションを取得し、クラスの日付でフィルター処理します。残念ながら、これによりデータベースへの 2 つのクエリが発生しますが、私の目的には問題ないはずです。

于 2010-05-13T02:34:02.267 に答える