Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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/blackberry/2.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
C# 合并或重用LINQ表达式_C#_Linq_Linq To Sql_Linq Expressions - Fatal编程技术网

C# 合并或重用LINQ表达式

C# 合并或重用LINQ表达式,c#,linq,linq-to-sql,linq-expressions,C#,Linq,Linq To Sql,Linq Expressions,我有一个LINQ表达式,在LINQ to SQL语句where子句中用作文件管理器。我的问题是LINQ到SQL表达式已经变得笨拙,而且它包含的逻辑已经在多个位置结束(这是我第三次处理QA提出的一个错误,因为它不同步) 有什么方法可以重用像下面这样的LINQ表达式或将其分解为更小的子表达式?我最大的问题是,因为表达式用于LINQ to SQL调用,所以它不能使用任何其他类或方法,因为LINQ to SQL库不知道如何将它们表示为SQL public static Expression<Fun

我有一个LINQ表达式,在LINQ to SQL语句where子句中用作文件管理器。我的问题是LINQ到SQL表达式已经变得笨拙,而且它包含的逻辑已经在多个位置结束(这是我第三次处理QA提出的一个错误,因为它不同步)

有什么方法可以重用像下面这样的LINQ表达式或将其分解为更小的子表达式?我最大的问题是,因为表达式用于LINQ to SQL调用,所以它不能使用任何其他类或方法,因为LINQ to SQL库不知道如何将它们表示为SQL

public static Expression<Func<MyClass, bool>> MyClassFilterExpression
{
    get
    {
        return x => (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 5)) ? "Refused" :
            (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 6)) ? "Cancelled" :
                (x.DateTimeExpired.HasValue && DateTime.Today > x.DateTimeExpired.Value) ? "Expired" :
                    (x.Duration.HasValue && x.DurationTypeID.HasValue && x.DateTimeApproved.HasValue) ?
                        (x.DurationTypeID == (int)DurationTypes.Day && DateTime.Today > x.DateTimeApproved.Value.AddDays(x.Duration.Value)) ? "Expired" :
                            (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 4 || y.StatusID == 10)) ? "Approved" : "Pending").Contains(filterValue);
    }
}
公共静态表达式MyClassFilterExpression
{
得到
{
返回x=>(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==5))?“拒绝”:
(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==6))?“已取消”:
(x.DateTimeExpired.HasValue&&DateTime.Today>x.DateTimeExpired.Value)?“过期”:
(x.Duration.HasValue&&x.DurationTypeID.HasValue&&x.DateTimeApproved.HasValue)?
(x.DurationTypeID==(int)DurationTypes.Day&&DateTime.Today>x.DateTimeApproved.Value.AddDays(x.Duration.Value))?“过期”:
(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==4 | | y.StatusID==10))?“已批准”:“待定”)。包含(filterValue);
}
}
理想情况下,我希望能够做到以下几点。它不起作用,因为LINQtoSQL无法表示GetStatus()方法。希望有其他聪明的方法可以做到这一点

public ReviewStatuses GetStatus(DateTime? dateTimeExpired, int? reviewStatusID)
{
    var isExpired = (dateTimeExpired.HasValue && DateTime.Today >= dateTimeExpired.Value.Date);

    if (reviewStatusID == ReviewStatuses.Cancelled.GetHashCode())
    {
        return ReviewStatuses.Cancelled;
    }
    else if (reviewStatusID == ReviewStatuses.Refused.GetHashCode())
    {
        return ReviewStatuses.Refused;
    }
    return ReviewStatuses.Pending;
}

public static Expression<Func<MyClass, bool>> MyClassFilterExpression
{
    get
    {
        return x => x.Status.Count > 0 && x.Status.Any(y => GetStatus(y.DateTimeExpired, y.StatusID)).Contains(filterValue);
    }
}
public reviewstatus使用GetStatus(DateTime?dateTimeExpired,int?reviewStatusID)
{
var isExpired=(dateTimeExpired.HasValue&&DateTime.Today>=dateTimeExpired.Value.Date);
if(reviewStatusID==ReviewStatuses.Cancelled.GetHashCode())
{
返回ReviewStatus。已取消;
}
else if(reviewStatusID==ReviewStatuses.rejected.GetHashCode())
{
返回ReviewStatus。拒绝;
}
返回reviewstatus.Pending;
}
公共静态表达式MyClassFilterExpression
{
得到
{
返回x=>x.Status.Count>0&&x.Status.Any(y=>GetStatus(y.DateTimeExpired,y.StatusID)).Contains(filterValue);
}
}

尝试以下方法:

public static Expression<Func<MyClass, bool>> GetMyClassFilterExpression(string filterValue) {

  if (filterValue == "Refused")
    return x => (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 5));
  else if (filterValue == "Cancelled")
    return x => (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 6));
  else if (filterValue == "Expired")
    return x => (x.DateTimeExpired.HasValue && DateTime.Today > x.DateTimeExpired.Value) ||
      (x.DurationTypeID == (int)DurationTypes.Day && DateTime.Today > x.DateTimeApproved.Value.AddDays(x.Duration.Value));
  else if (filterValue == "Approved")
    return x => (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 4 || y.StatusID == 10));
  // and so on...
  else
    throw new ArgumentException("Your message.");
}

....

string filterValue = "Refused";
Expression<Func<MyClass, bool>> whereCluase = GetMyClassFilterExpression(filterValue);
var list = dataContext.MyClasses.Where(whereCluase).ToList();
公共静态表达式GetMyClassFilterExpression(字符串filterValue){
如果(filterValue==“拒绝”)
返回x=>(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==5));
否则如果(filterValue==“已取消”)
返回x=>(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==6));
否则如果(filterValue==“过期”)
返回x=>(x.DateTimeExpired.HasValue&&DateTime.Today>x.DateTimeExpired.Value)||
(x.DurationTypeID==(int)DurationTypes.Day&&DateTime.Today>x.DateTimeApproved.Value.AddDays(x.Duration.Value));
否则如果(filterValue==“已批准”)
返回x=>(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==4 | | y.StatusID==10));
//等等。。。
其他的
抛出新的ArgumentException(“您的消息”);
}
....
字符串filterValue=“拒绝”;
表达式,其中CLUSE=GetMyClassFilterExpression(filterValue);
var list=dataContext.MyClasses.Where(whereCluase.ToList();

尝试以下方法:

public static Expression<Func<MyClass, bool>> GetMyClassFilterExpression(string filterValue) {

  if (filterValue == "Refused")
    return x => (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 5));
  else if (filterValue == "Cancelled")
    return x => (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 6));
  else if (filterValue == "Expired")
    return x => (x.DateTimeExpired.HasValue && DateTime.Today > x.DateTimeExpired.Value) ||
      (x.DurationTypeID == (int)DurationTypes.Day && DateTime.Today > x.DateTimeApproved.Value.AddDays(x.Duration.Value));
  else if (filterValue == "Approved")
    return x => (x.Status.Count > 0 && x.Status.Any(y => y.StatusID == 4 || y.StatusID == 10));
  // and so on...
  else
    throw new ArgumentException("Your message.");
}

....

string filterValue = "Refused";
Expression<Func<MyClass, bool>> whereCluase = GetMyClassFilterExpression(filterValue);
var list = dataContext.MyClasses.Where(whereCluase).ToList();
公共静态表达式GetMyClassFilterExpression(字符串filterValue){
如果(filterValue==“拒绝”)
返回x=>(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==5));
否则如果(filterValue==“已取消”)
返回x=>(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==6));
否则如果(filterValue==“过期”)
返回x=>(x.DateTimeExpired.HasValue&&DateTime.Today>x.DateTimeExpired.Value)||
(x.DurationTypeID==(int)DurationTypes.Day&&DateTime.Today>x.DateTimeApproved.Value.AddDays(x.Duration.Value));
否则如果(filterValue==“已批准”)
返回x=>(x.Status.Count>0&&x.Status.Any(y=>y.StatusID==4 | | y.StatusID==10));
//等等。。。
其他的
抛出新的ArgumentException(“您的消息”);
}
....
字符串filterValue=“拒绝”;
表达式,其中CLUSE=GetMyClassFilterExpression(filterValue);
var list=dataContext.MyClasses.Where(whereCluase.ToList();

我认为L2S无法将
开关转换为SQL。我认为L2S无法将
开关转换为SQL。