4

私はそのように見えるクエリを持っています....

var q = Dal.TBLINVENTORies.Where(i => i.SHOWIT);
q = q.Where(i => i.dtStart < DateTime.Now || i.dtStart == null);
q = q.Where(i => i.dtEnd > DateTime.Now || i.dtEnd == null);
q = q.Where(i => i.sSystem.Contains("OE"));
q = q.Where(i => i.WS_ActiveList_ID == 0 || i.tblWS_ActiveList.WS_MasterList_ID == 16);
var test2 = q.ToList();

「ToList()」の直前で、クエリを調べると、次の sql が得られます (多かれ少なかれ)

SELECT [Extent1].*
FROM  [dbo].[TBLINVENTORY] AS [Extent1]
INNER JOIN [dbo].[tblWS_ActiveList] AS [Extent2] ON [Extent1].[WS_ActiveList_ID] = [Extent2].[ID]
WHERE ([Extent1].[SHOWIT] = 1) 
AND (([Extent1].[dtStart] <  CAST( SysDateTime() AS datetime2)) OR ([Extent1].[dtStart] IS NULL)) 
AND (([Extent1].[dtEnd] >  CAST( SysDateTime() AS datetime2)) OR ([Extent1].[dtEnd] IS NULL)) 
AND ([Extent1].[sSystem] LIKE '%OE%') 
AND ([Extent1].[WS_ActiveList_ID] = 0  OR [Extent2].[WS_MasterList_ID] = 16)

残念ながら、これは私が必要としているものではありません。"Inventory" と "ActiveList" の関係は実際には 1 対多ではなく、0 対多であるためです (正しい用語を使用しているかどうかわかりません)。基本的に、在庫アイテムには関連する「ActiveList」がある場合とない場合があります。

生の SQL を のLEFT OUTER JOIN代わりに ,を使用するように変更するINNER JOINと、SQL は期待どおりの値を返します。

LEFT OUTER JOIN を強制するには何が必要ですか?

Linq からエンティティへの推奨される解決策を試しました- 一対多の関係 - cross join の代わりに left outside join が必要ですが、

var q2 = from inv in Dal.TBLINVENTORies from al in inv.tblWS_ActiveList

エラーを返します:

Error 65 An expression of type 'xxxx.DAL.tblWS_ActiveList' is not allowed in a subsequent from clause in a query expression with source type 'System.Data.Entity.DbSet<xxxx.DAL.TBLINVENTORY>'. Type inference failed in the call to 'SelectMany'.

リンク/関係が正しく構築されていないのでしょうか? 他のアイデアはありますか?

ありがとう!

編集 :: 追加データ

-- create foreign key, but don't enforce on existing values
ALTER TABLE [dbo].[tblInventory]  --the ONE Table
    WITH NOCHECK 
    ADD CONSTRAINT [FK__tblInventory.WS_ActiveList_ID__tblWS_ActiveList.ID] 
        FOREIGN KEY([WS_ActiveList_ID]) 
            REFERENCES [dbo].[tblWS_ActiveList] ([ID])    --the MANY Table
        NOT FOR REPLICATION
GO

-- disable enforcement of the foreign key, but leave it in place (virtual key)
ALTER TABLE [dbo].[tblInventory]  
    NOCHECK CONSTRAINT [FK__tblInventory.WS_ActiveList_ID__tblWS_ActiveList.ID] 
GO

および WS_ActiveList_ID の定義:

[WS_ActiveList_ID] [int] NOT NULL CONSTRAINT [DF_TBLINVENTORY_WS_ActiveList_ID] DEFAULT (0),
4

1 に答える 1

2

あなたの主な問題は、データベースの参照整合性チェックをオフにしたことです。

不正なデータという明らかな問題は別として、これは EF では機能しません。

断然最良のオプションは、WS_ActiveList_IDnull 可能にし、データを更新してすべての0s をNULLs に変更し、制約をオンに戻すことです。

dbContext.Database.SqlQuery<T>それができない場合は、SQL文を文字列として生成し、 ( MSDN)で実行する必要があると思います

于 2013-03-21T16:24:41.377 に答える