Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将null作为包含()传递到";“linq到sql”;查询_Linq_Linq To Sql - Fatal编程技术网

将null作为包含()传递到";“linq到sql”;查询

将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

我对linq to sql查询中的Contains有如下问题:

 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[]{}:-,谢谢。