Böyle bir yöntem sorgusu vardır: Linq SQL denemeden için:"Nullable nesnesinin bir değeri olmalıdır." Linq To-Sql
Çalışma zamanındapublic IList<BusinessObject> GetBusinessObject(Guid? filterId)
{
using (var db = new L2SDataContext())
{
var result = from bo in db.BusinessObjects
where (filterId.HasValue)
? bo.Filter == filterId.value
: true
orderby bo.Name
select SqlModelConverters.ConvertBusinessObject(bo);
return result.ToList();
}
}
, bu System.InvalidOperationException: Nullable object must have a value.
Debugger baktığımızda atar, sorun benim nerede Clause olduğunu Tüm şeyi SQL'e dönüştürmek, böylece filterId NULL olsa bile, filterId.value erişmeye çalışacaktır.
C# derleyicisi/CLR'nin kod bloğu olarak tümceyi nereye yazacağını ve yalnızca iki daldan birini Linq To SQL'e göndereceğini düşündüm. Benim Refactored versiyonu çalışır, ancak çok şık değil
:
public IList<BusinessObject> GetBusinessObject(Guid? filterId)
{
using (var db = new L2SDataContext())
{
var temp = from bo in db.BusinessObjects select bo;
if(filterId.HasValue) temp = temp.Where(t => t.Filter == filterId.Value);
var result = from t in temp
orderby t.Name
select SqlModelConverters.ConvertBusinessObject(bo);
return result.ToList();
}
}
Bunun yoktur Lazy-Değerlendirme yalnızca bir sorgu gerçekten gönderilir emin olun, ama bu geçici bir nesne sahip olacağını biliyoruz gerçekten harika.
vay Oh, bu mükemmel çalışıyor! Beni, hafif okunamayan tersiyer operatörünü kullanmaktan kurtarır ve yalnızca filterId yerine filterId.Value öğesine gereksiz yere erişmenin neden olduğu gerçek İstisnayı çözer. –