4

結合されたテーブルの列が変数と等しいか、変数が null である列を照合することにより、LINQ を使用してテーブルを結合しようとしています (その時点で、結合はそのフィールドではなくまだ発生する必要があります)。

私のLINQは次のようなものです:

var data = (
    from lt in cxt.CmsPageRow
    join page in cxt.CmsPage on new { lt.CmsPageID, cmsSiteID.Value } equals new { page.CmsPageID, page.CmsSiteID }
    ...

cmsSiteID は null 許容の INT です。

「'Join' の呼び出しで型の推論に失敗しました」と不平を言っているため、コードをコンパイルできません。

その上、cmsSiteID が null でない場合にのみ、page.CmsSiteID に参加する必要があります。cmsSiteID が null の場合でも、lt.CmsPageID での結合が必要です。

* 編集 *

質問がちょっと変わりました。LINQ の結合で WHERE 句を使用することで、必要なことを実行できます。

join page in cxt.CmsPage.Where(p=>(cmsSiteID==0||p.CmsSiteID==cmsSiteID)) on lt.CmsPageID equals page.CmsPageID

ただし、これはまだ低速です。渡されたパラメーターをリテラルに変更すると、即座に実行されます。

スローランナー

(@p__linq__1 = 0 OR [Extent2].[CmsSiteID] = @p__linq__1)

速いランナー

(267 = 0 OR [Extent2].[CmsSiteID] = 267)

これをスピードアップする方法はありますか?

4

1 に答える 1

2

joinLINQ では、内部結合 (null なし) を想定しています。wherenull のものを別々の句に引き出してみてください。これらの線に沿った何かが、あなたが説明しているものに役立つはずだと思います.

from lt in cxt.CmsPageRow
join page in cxt.CmsPage on lt.CmsPageID == page.CmsPageID
where cmsSiteID == null || 
      (cmsSiteID != null && (page.CmsSiteID == null || page.CmsSiteId == cmsSiteID.Value))
select ...

アップデート

あなたにとってパフォーマンスが問題だとは知りませんでした。その場合、実行時に既知であり、個々の行に依存しない値に基づいて、別のクエリ構造を作成することをお勧めします。

var rows = 
    from lt in cxt.CmsPageRow
    join page in cxt.CmsPage on lt.CmsPageID == page.CmsPageID
    select new {lt, page};
if (cmsSiteID != null)
{
    rows = rows.Where(r => r.page.CmsSiteID == null || 
                           r.page.CmsSiteId == cmsSiteID.Value));
}
var data = rows.Select(...);

また、データ コンテキストが正しく設定されていれば、ナビゲーション プロパティを使用してコードをいくらか簡素化できるはずです。

var rows = ctx.CmsPageRow;
if (cmsSiteID != null)
{
    rows = rows.Where(r => r.CmsPage.Any(p => p.CmsSiteID == null || 
                               p.CmsSiteId == cmsSiteID.Value));
}
var data = rows.Select(...);
于 2013-02-22T00:12:23.230 に答える