【问题标题】:Dynamic Linq Search Expression on Navigation Properties导航属性上的动态 Linq 搜索表达式
【发布时间】:2011-03-03 06:04:56
【问题描述】:

我们正在使用 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;}
}

【问题讨论】:

  • 能把FamilyName表达的代码贴出来吗?

标签: linq dynamic-linq


【解决方案1】:

我们把它算出来并成功了,但这非常具有挑战性。以下是我们如何取得最终结果的各种方法。现在我们只需要重新考虑我们的 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 方法。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2010-12-28
    • 2016-04-18
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多