将null作为包含()传递到";“linq到sql”;查询
我对linq to sql查询中的Contains有如下问题:将null作为包含()传递到";“linq到sql”;查询,linq,linq-to-sql,Linq,Linq To Sql,我对linq to sql查询中的Contains有如下问题: public IAuditRecord[] Fetch(SearchConditions searchConditions) { IAuditRecord[] searchedList = (from rows in _dbContex.AuditTrails where
public IAuditRecord[] Fetch(SearchConditions searchConditions)
{
IAuditRecord[] searchedList = (from rows in _dbContex.AuditTrails
where
(searchConditions.Owner == null || searchConditions.Owner == 0) ? true : rows.Owner == searchConditions.Owner
&&
/*This line cannot compile when ActionIDs array is empty*/
(searchConditions.ActionIDs != null && searchConditions.ActionIDs.Length != 0) ? searchConditions.ActionIDs.Contains(rows.UserActionID) : true
&& ((searchConditions.StartDate != null && searchConditions.EndDate != null) ? (rows.TimeStamp >= searchConditions.StartDate && rows.TimeStamp <= searchConditions.EndDate)
: (searchConditions.StartDate != null && searchConditions.EndDate == null) ? rows.TimeStamp >= searchConditions.StartDate : (searchConditions.StartDate == null && searchConditions.EndDate != null) ? (rows.TimeStamp <= searchConditions.EndDate)
: true)
select rows).ToArray();
return searchedList;
}
public IAuditRecord[]获取(SearchConditions SearchConditions)
{
IAuditRecord[]searchedList=(来自_dbContex.AuditTrails中的行
哪里
(searchConditions.Owner==null | | searchConditions.Owner==0)?true:rows.Owner==searchConditions.Owner
&&
/*ActionIDs数组为空时无法编译此行*/
(searchConditions.ActionId!=null&&searchConditions.ActionId.Length!=0)?searchConditions.ActionId.Contains(rows.UserActionID):true
&&((searchConditions.StartDate!=null&&searchConditions.EndDate!=null)?(rows.TimeStamp>=searchConditions.StartDate&&rows.TimeStamp=searchConditions.StartDate:(searchConditions.StartDate==null&&searchConditions.EndDate!=null)?(rows.TimeStamp您正在构建一个IQueryable
,它定义了如何查询某个内容,而不是实际执行该操作。为此,它构建了一个表达式,该表达式定义了所有查询意图,并可在以后被调用以实际获取数据。如果您使用LINQ to对象,这可能会起作用,因为它可能会调用searchConditions.ActionId!=null
首先,然后知道它不必尝试执行第二部分。Linq to Entities/SQL等没有这个好处
长话短说,您可以:
searchConditions.ActionIDs = searchConditions.ActionIDs ?? new int[];
如果为空,则执行其他查询,如:
var query = _dbContext.AuditTrails;
if(searchConditions.ActionIDs != null && searchCondition.ActionIDs.Length != 0)
{
query = // Further filtered query where ActionIDs are taken into account.
嗯,乍一看一切都是对的。我可能建议你做一些关于规范模式的研究。你的谓词(例如where子句)对于过滤记录而言,阅读和理解这些记录非常复杂,无需仔细查看。通过创建一些规范,您可以极大地提高代码的可读性,并简化调试工作(您可能知道哪个规范失败)。为什么它会工作?对设置为null的对象调用任何函数都会导致NullReferenceException
,因为他正在检查null:searchConditions.ActionID!=null
。是的,当ActionID为null时,包含无法工作,无论如何,谢谢大家。这已经是我的最后一个解决方案,但我接受了你们的答案,“new int[]”必须更改为“new int[]{}:-,谢谢。