谓词在联接lambda表达式中不起作用

本文关键字:表达式 不起作用 lambda 谓词 | 更新日期: 2023-09-27 18:15:17

我已经使用PredicateBuilder类在LINQ语句中动态创建了Where子句。

下面是我的代码是当使用谓词

var predicate = PredicateBuilder.True<tbl_login>();
predicate = predicate.And(x => x.DAT_LOGIN_TIME >= startDate && x.DAT_LOGIN_TIME <= endDate);`
var data = context.tbl_login.Join(context.tbl_user, x => x.LNG_USER_PRIMARY_ID, y => y.LNG_USER_PRIMARY_ID, (x, y) => new
{
    userID = x.LNG_USER_PRIMARY_ID,
    loginTime = x.DAT_LOGIN_TIME,
    ageGroup = y.INT_AGE_GROUP
}).Where(predicate)
  .Select(x => new 
    { 
      userID = x.userID, 
      ageGroup = x.ageGroup 
    }).Distinct().ToList();              

它给了我编译时异常cannot convert from System.Linq.Expressions.Expression<System.Func<JoyRydeAnalysis.Data.tbl_login,bool>>' to System.Linq.Expressions.Expression<System.Func<AnonymousType#1,int,bool>

我错过了什么?

谓词在联接lambda表达式中不起作用

您的谓词是tbl_login的谓词。但是这里,你投射到一个匿名类型:

(x, y) => new
{
    userID = x.LNG_USER_PRIMARY_ID,
    loginTime = x.DAT_LOGIN_TIME,
    ageGroup = y.INT_AGE_GROUP
}

该谓词不能应用于该投影。

我怀疑你可能想要更早地应用谓词:

var data = context.tbl_login
                  .Where(predicate)
                  .Join(...)
                  .Select(...)
                  .Distinct()
                  .ToList();

请注意,此时Select将是冗余的,因为您可以在Join调用中更改投影。

老实说,这也很清楚你为什么要使用PredicateBuilder。您只使用单个表达式连接PredicateBuilder.True -因此您可以使用:

var data = context.tbl_login
                  .Where(x => x.DAT_LOGIN_TIME >= startDate && x.DAT_LOGIN_TIME <= endDate)
                  .Join(...)
                  .Select(...)
                  .Distinct()
                  .ToList();