Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# linq到实体动态查询_C#_Linq_Linq To Entities - Fatal编程技术网

C# linq到实体动态查询

C# linq到实体动态查询,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我目前正在将我们的旧系统迁移到.Net,我遇到了这个问题。 我想返回结果,但在函数完成后仍需要对其进行细化,但使用这段代码,我别无选择,只能从数据库调用结果并过滤内存中的结果,这会导致性能低下 public IQueryable<User> GetUser(string[] accessCodes) { string condition = ""; if (accessCodes == null) { condition = " Access

我目前正在将我们的旧系统迁移到.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 GetUser(字符串[]accesscode)
{
字符串条件=”;
if(accessCodes==null)
{
条件=“AccessCode不为空”
}
其他的
{

对于(int i=0;i您可以尝试使用
任何

else
{
    output = output.Where(u => accessCodes.Any(a => u.AccessCode.Contains(a)));
}
或者您可以使用:

if(accessCodes==null)
{
output=output.Where(u=>u.AccessCode==null);
}
其他的
{
var predicate=PredicateBuilder.False();
对于(int i=0;i u.AccessCode.Contains)(accessCodes[i]))
}
output=output.Where(谓词);
}

我还更改了您的
,如果
部分:
其中
方法不修改源,它将返回新的查询定义,因此您必须将其分配回
输出
,以使其工作。

这应该适用于您:

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));
}
IQueryable basequery=来自上下文中的u。用户
选择u;
if(accessCodes==null)
{
basequery=basequery.Where(u=>u.AccessCode!=null);
}
其他的
{
basequery=basequery.Where(u=>accessCodes.Contains(u=>u.AccessCode));
}

另外,请确保返回
basequery
,因为方法中的
output
未定义也未使用。

请您简单解释一下您试图实现的目标是什么?您想根据什么标准筛选用户?如果只有一个访问代码,这将起作用,但正如我在上面发布的内容,有时需要不止一个访问代码,这就是它位于循环中的原因。accessCodes.Contains(u=>u.AccessCode)它将生成您所需的内容。
Contains
迭代代码,linq将正确处理这些代码。使用
ToTraceString()检查输出查询
method..Contains不够,假设accessCode仅由字符串“m”组成,它必须检索“m”、“mx”、“m3”、“mp”而不仅仅是“m”。对不起,我想搜索列表中的访问代码。嗨,Marcin,当我使用“.Any”时,它会引发异常DbExpressionBinding需要一个集合ResultType为“”的输入表达式。我尝试直接使用谓词生成器,但它也引发了一个错误“不支持LINQ表达式节点类型“Invoke”。我已阅读了谓词生成器指令,为了在实体框架中使用谓词生成器,我需要使用“LINQKit.dll”“。如果不使用LINQKit.dll,还有什么解决方法吗?您好,没关系,.any()就足够了,似乎我一直在使用char[]而不是string[],这导致了异常。
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);
}
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));
}