Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 实体框架中的条件泛型Where equals子句_C#_Entity Framework_Linq_Lambda - Fatal编程技术网

C# 实体框架中的条件泛型Where equals子句

C# 实体框架中的条件泛型Where equals子句,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,我试图创建一个where子句,我可以将它传入func和属性,然后比较它们。我有一个需要比较的不同属性的长列表,所以我想要一个扩展方法来包装它 下面是我想如何使用它: string transactionNumber = "12345"; Queryable<TranCard> transactions = _context.TranCard .WhereEquals(t => t.TransactionNumber, transactionNumber) .To

我试图创建一个where子句,我可以将它传入func和属性,然后比较它们。我有一个需要比较的不同属性的长列表,所以我想要一个扩展方法来包装它

下面是我想如何使用它:

string transactionNumber = "12345";
Queryable<TranCard> transactions = _context.TranCard
    .WhereEquals(t => t.TransactionNumber, transactionNumber)
    .ToList();
string transactionNumber=“12345”;
可查询事务=_context.trakard
.WhereEquals(t=>t.TransactionNumber,TransactionNumber)
.ToList();
以下是我目前使用的导致我出现问题的扩展方法:

public static IQueryable<T> WhereEquals<T>(this IQueryable<T> source, Func<T, string> expression, string queryParam)
    {
        return source.Where(t => string.IsNullOrWhiteSpace(queryParam)
                                 || expression != null
                                 && string.Equals(queryParam.Trim(), expression.Invoke(t).Trim(), StringComparison.OrdinalIgnoreCase));
    }
public static IQueryable WhereEquals(此IQueryable源、Func表达式、字符串queryParam)
{
返回source.Where(t=>string.IsNullOrWhiteSpace(queryParam)
||表达式!=null
&&等于(queryParam.Trim(),expression.Invoke(t.Trim(),StringComparison.OrdinalIgnoreCase));
}
当我尝试运行此程序时,它会抛出以下运行时错误消息:
“为调用方法‘Boolean Equals(System.String,System.String,System.StringComparison)’提供的参数数量不正确”

我能够通过分离调用使其正常工作。这也使它更容易阅读

public static IQueryable<T> WhereEquals<T>(this IQueryable<T> source, Func<T, string> expression, string queryParam)
    {
        if (string.IsNullOrWhiteSpace(queryParam))
        {
            return source;
        }

        return source.Where(x => expression(x).Trim().ToLower() == queryParam.Trim().ToLower());
    }
public static IQueryable WhereEquals(此IQueryable源、Func表达式、字符串queryParam)
{
if(string.IsNullOrWhiteSpace(queryParam))
{
返回源;
}
返回source.Where(x=>expression(x).Trim().ToLower()==queryParam.Trim().ToLower());
}

谢谢大家的帮助

有堆栈跟踪吗?该方法在对象列表上运行良好,因此我的下一个猜测是EF在将其SQL化时遇到了问题。这不是表达式与IQueryable的工作方式。您需要为IQueryable生成表达式树,而不是调用它。表达式由基础提供程序计算@EdPlunkett之所以能够工作,是因为它位于内存对象中,而不是sql对象(底层提供程序需要表达式映射来生成相应的sql语句)。我不能在评论中全部解释,但希望OP能得到要点。@vendettamit你有什么关于如何重构扩展方法以使其工作的建议吗?也许这会有所帮助。