Linq To实体Where条件与表达式的比较

本文关键字:表达式 比较 条件 To 实体 Where Linq | 更新日期: 2023-09-27 18:21:24

我有3个用实体框架映射的类

public class A
{
    public string Name { get; set; }
}
public class B
{
    public string Name { get; set; }
    public A A { get; set; }
}
public class C
{
    public string Name { get; set; }
}

我有这个Linq到条件的实体

return queryableOfB.Where(b => b.A.Name = instanceOfC.Name);

因为这是我逻辑中的一个重复方法,我想创建一个方法作为:

protected void GetFilter<B, TBProperty, TCProperty>(
        IQueryable<B> queryofB, C cModel, 
        Expression<Func<B, TBProperty>> bExpression,
        Expression<Func<C, TCProperty>> cExpression)
    {
        var bExpValue = cExpression.Compile()(cModel);
        queryofB.Where(b => b.Property.EndsWith(bExpValue)); // How can I compare two expressions? but adding "for example" an .EndsWith to expression 1?
    }

重要的是不要在表达式中传递.EndsWith,因为必须在方法中决定使用EndsWith、StartsWith和Contains或进行精确比较。

提前感谢大师。

Linq To实体Where条件与表达式的比较

实际上where方法期望函数作为谓词。你可以试试下面的。

它什么也不做,只是调用where Extension方法。最好使用where方法内联。但是告诉你怎么做。

  static IEnumerable<T1> M<T1>(IEnumerable<T1> objEnumerable, Func<T1, bool> wherePredicate)
  {
      return objEnumerable.Where(predicate);
  }
  // calling like 
  var listOfBObjects = GetBObjectIEnumerable();
  C instanceOfC  = GetCClassObject();
  M<B>(listOfBObjects, b => b.A.Name = instanceOfC.Name);

更新

你可以使用

  M<B>(listOfBObjects, b => b.A.Name.Equals(instanceOfC.Name));
  M<B>(listOfBObjects, b => b.A.Name.StartsWith(instanceOfC.Name));
  M<B>(listOfBObjects, b => b.A.Name.Contains(instanceOfC.Name));

以提高性能等等。是的,您可以使用IQueryable而不是IEnumerable