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登录时间