我使用实体框架和Linq Querable,我想使用multiple where子句选择一些数据。
在我的数据库中,我在一个字段中可能有多个ID FieldOfInterestID
,由"分隔;" (我知道,我知道,但是做某事要迟到),或者只是一个id,这意味着逗号不会出现
我想用&#34 ;;"分割字符串。分隔符,以及在where子句中使用它们的所有id。
我的代码看起来像这样:
await ctx.Customer.AsNoTracking()
.Where(e => e.UserId == userId)
.Select(e => new UserDTO {
FieldsOfStudy = ctx.Terms.Where(t => {
if (!e.FieldOfInterestID.Contains(";") && t.TermId.ToString() == e.FieldOfInterestID)
return true;
else if (e.FieldOfInterestID.Contains(";")
{
string fieldOfInterestIds = e.FieldOfInterestID.Split(";");
foreach (string fieldOfInterestID in fieldOfInterestIds)
{
if (t.TermId.ToString() == e.FieldOfInterestID)
return true;
else
return false;
}
}
else
return false;
}
})
.ToListAsync().ConfigureAwait(false);
我目前的错误"是not all code paths return a value...
如何更好地在where子句中使用string []?
答案 0 :(得分:2)
目前的错误是因为这个分支:
foreach (string fieldOfInterestID in fieldOfInterestIds)
{
if (t.TermId.ToString() == e.FieldOfInterestID)
return true;
else
return false;
}
从编译器的角度来看,可能无法输入foreach
的正文,因此not all code paths return a value...
。
您可以通过移动身体外的return false;
来修复它:
foreach (string fieldOfInterestID in fieldOfInterestIds)
{
if (t.TermId.ToString() == e.FieldOfInterestID)
return true;
}
return false;
这将修复编译器错误,但不能解决问题。运行它之后,您会发现LINQ to Entities不支持带有body(=> { ... }
)和string.Split
方法的lambda表达式。
真正的解决方案需要不同的标准 - 而不是不受支持的
e.FieldOfInterestID.Split(";").Contains(t.TermId.ToString())
相反但支持(使用字符串连接和string.Contains
)
(";" + e.FieldOfInterestID + ";").Contains(";" + t.TermId + ";")
需要用;
括起两个字符串才能正确处理第一个,中间和最后一个令牌。
最终查询可能是这样的:
var query = ctx.Customer.AsNoTracking()
.Where(e => e.UserId == userId)
.Select(e => new UserDTO
{
FieldsOfStudy = ctx.Terms
.Where(t => (";" + e.FieldOfInterestID + ";").Contains(";" + t.TermId + ";"))
});
答案 1 :(得分:1)
这条线对我来说似乎不对:
string fieldOfInterestIds = e.FieldOfInterestID.Split(";");
我会将其更改为:
string[] fieldOfInterestIds = e.FieldOfInterestID.Split(";");
我也会简化代码:
ctx.Terms.Where(t => return e.FieldOfInterestID.Split(";").Contains(t.TermId.ToString()));
如果字符串不包含;
个字符,则返回带有一个项目的字符串[]