linq到实体的动态查询

本文关键字:动态 查询 实体 linq | 更新日期: 2023-09-27 18:00:31

我目前正在将旧系统迁移到.Net,遇到了这个问题。我想返回结果,但我仍然需要在函数之后对其进行细化,但使用这段代码,我别无选择,只能从数据库中调用结果,并过滤内存中的结果,这会降低性能。

public IQueryable<User> GetUser(string[] accessCodes)
{
    string condition = "";
    if (accessCodes == null)
    {
         condition = " AccessCode IS NOT NULL "
    }
    else
    {
        for (int i = 0; i <= accessCodes.Length - 1; i++)
        {
            condition += " AccessCode LIKE '%" + accessCodes[i].ToString() + "%' ";
            if (i + 1 <= code.Length - 1)
            {
                condition += " OR ";
            }
        }
    }
    return context.ExecuteQuery<User>("SELECT * FROM User WHERE " + condition, null).ToList();
}

我尝试过这种方法,但我被卡住了:

public IQueryable<User> GetUser(string[] accessCodes)
{
    IQueryable<User> basequery = from u in context.User 
                                 select u;
    if (accessCodes == null)
    {
         basequery = basequery.Where(n => n.AccessCode != null);
    }
    else
    {
        for (int i = 0; i <= accessCodes.Length - 1; i++)
        {
            // what am I supposed to do here?
        }
    }
    return basequery;
}

我希望有一些不需要第三方库的解决方案。

linq到实体的动态查询

您可以尝试使用Any:

else
{
    output = output.Where(u => accessCodes.Any(a => u.AccessCode.Contains(a)));
}

或者您可以使用PredicateBuilder:

if (accessCodes == null)
{
    output = output.Where(u => u.AccessCode == null);
}
else
{
    var predicate = PredicateBuilder.False<User>();
    for (int i = 0; i <= accessCodes.Length - 1; i++)
    {
        predicate = predicate.Or(u => u.AccessCode.Contains(accessCodes[i]))
    }
    output = output.Where(predicate);
}

我还更改了您的if部分:Where方法不修改源,它返回新的查询定义,所以您必须将其分配回output才能使其工作。

这应该适用于您:

IQueryable<User> basequery = from u in context.User 
                             select u;
if (accessCodes == null)
{
    basequery = basequery.Where(u => u.AccessCode != null);
}
else
{
    basequery = basequery.Where(u => accessCodes.Contains(u=>u.AccessCode));
}

还要确保返回basequery,因为方法中的output没有定义也没有使用。