1

我们正在使用 Dynamic Linq 库构建动态搜索表达式。我们遇到了一个问题,即如何使用动态 linq 库为具有一对多关系的导航属性构建一个 Lamba 表达式。

我们将以下内容与 contains 语句一起使用 -

 Person.Names.Select(FamilyName).FirstOrDefault()

它有效,但有两个问题。

  1. 它当然只选择 FirstOrDefault() 名称。我们希望它使用每个人的所有名字。

  2. 如果没有人的姓名,则 Select 会引发异常。

使用常规查询并不难,因为我们可以执行两个 from 语句,但 lambda 表达式更具挑战性。

任何建议将不胜感激。

编辑-附加代码信息...非动态 linq 表达式看起来像这样。

 var results = persons.Where(p => p.Names.Select(n => n.FamilyName).FirstOrDefault().Contains("Smith")).ToList();

课程如下所示 -

public class Person
{
 public bool IsActive { get; set;}

 public virtual ICollection<Name> Names {get; set;}
}

public class Name
{
public string GivenName { get; set; }

public string FamilyName { get; set; }

public virtual Person Person { get; set;}
}
4

1 回答 1

2

我们把它算出来并成功了,但这非常具有挑战性。以下是我们如何取得最终结果的各种方法。现在我们只需要重新考虑我们的 SearchExpression 类是如何构建的……但那是另一回事了。

1.等效查询语法

var results = from person in persons
from name in person.names
where name.FamilyName.Contains("Smith")
select person;

2. 等价的 Lambda 语法

var results = persons.SelectMany(person => person.Names)
                     .Where(name => name.FamilyName.Contains("Smith"))
                     .Select(personName => personName.Person);

3. 使用动态 Linq 的等效 Lambda 语法

var results = persons.AsQueryable().SelectMany("Names")
                     .Where("FamilyName.Contains(@0)", "Smith")
                     .Select("Person");

注意- 您必须向 Dynamic Linq 库添加 Contains 方法。

编辑 - 或者只使用一个选择......更简单......但它需要包含上面提到的方法添加。

var results = persons.AsQueryable().Where("Names.Select(FamilyName)
                                   .Contains(@0", "Smith)

我们最初尝试过这个,但遇到了可怕的“没有适用的聚合方法包含存在”。错误。我在尝试使 SelectMany 工作时解决了问题的方法......因此回到了 Select 方法。

于 2011-03-03T21:43:05.113 回答