linqのエンティティに対する実際のクエリは、このようにdbに対してうまくいきます。オブジェクトへのlinqを使用してクエリをユニット化しようとすると、null参照例外が発生します。Linqからオブジェクトへの一連の左結合をどのように処理するのですか?
linqPadで再現しました。
void Main()
{
var _news= new [] {new {ID=0, ExpiryDate=(DateTime?)null }, new {ID=1,ExpiryDate=(DateTime?)DateTime.UtcNow.AddDays(-1)}};
var _newsRegionSource = new RegionSource[]{};
var _entitledRegions=new Region[] {};
var validNews = from n in _news.Where(n=>n.ExpiryDate==null || n.ExpiryDate>DateTime.UtcNow)
select n;
var q = from n in validNews
join r in _newsRegionSource
on n.ID equals r.ID into rLeft
from rn in rLeft.DefaultIfEmpty()
join erL in _entitledRegions
// adding .DefaultIfEmpty() here instead moves the exception to erL.ID
//NullReferenceException underlining rn at rn.RegionID
on rn.RegionID equals erL.ID into erLeft
from er in erLeft.DefaultIfEmpty()
where rn==null | (rn.ID==n.ID && er!=null)
select new {News=n,RegionID=(rn==null? (byte?)null: rn.RegionID)};
var materialized=q.ToArray();
materialized.Dump();
}
public class Region
{
public byte ID {get;set;}
}
public class RegionSource
{
public int ID{get;set;}
public byte RegionID{get;set;}
}
はまた、私は製造
- を試み確認がソース・アレイの全てにおいて、少なくとも1つのアイテムであった(彼らはまだ、この特定のクエリ/場合の0行をもたらす)、
.AsQueryable()
で配列をラップするにはどうすれば左Linq to Objects
でおそらく0行の合流扱うのですか?