C# linq到实体动态查询
我目前正在将我们的旧系统迁移到.Net,我遇到了这个问题。 我想返回结果,但在函数完成后仍需要对其进行细化,但使用这段代码,我别无选择,只能从数据库调用结果并过滤内存中的结果,这会导致性能低下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
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));
}