C# 实体框架中的条件泛型Where equals子句
我试图创建一个where子句,我可以将它传入func和属性,然后比较它们。我有一个需要比较的不同属性的长列表,所以我想要一个扩展方法来包装它 下面是我想如何使用它: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
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你有什么关于如何重构扩展方法以使其工作的建议吗?也许这会有所帮助。