EF使用Lambda表达式

时间:2016-11-02 11:52:24

标签: c# .net entity-framework linq lambda

我使用实体框架和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 []?

2 个答案:

答案 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()));

如果字符串不包含;个字符,则返回带有一个项目的字符串[]