Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 谓词在联接lambda表达式中不起作用_C#_Entity Framework_Linq_Predicatebuilder - Fatal编程技术网

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

C# 谓词在联接lambda表达式中不起作用,c#,entity-framework,linq,predicatebuilder,C#,Entity Framework,Linq,Predicatebuilder,我使用了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_

我使用了
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();              
var predicate=PredicateBuilder.True();
谓词=谓词。和(x=>x.DAT\u LOGIN\u TIME>=startDate&&x.DAT\u LOGIN\u TIME x.LNG\u USER\u PRIMARY\u ID,y=>y.LNG\u USER\u PRIMARY\u ID,(x,y)=>new
{
userID=x.LNG\u USER\u PRIMARY\u ID,
登录时间=x.DAT\u登录时间,
年龄组=y.INT\U年龄组
}).Where(谓词)
.选择(x=>new
{ 
userID=x.userID,
年龄组=x.ageGroup
}).Distinct().ToList();

它给出了编译时异常
无法从System.Linq.Expressions.Expression'转换为System.Linq.Expressions.Expression您的谓词是
tbl\U登录的谓词。但在这里,您将投影到一个匿名类型:

(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();
var data=context.tbl\u登录
其中(x=>x.DAT\u登录时间>=startDate&&x.DAT\u登录时间