gpt4 book ai didi

c# - 如何为 EntitySet 构造 Where 子句

转载 作者:太空宇宙 更新时间:2023-11-03 15:55:48 25 4
gpt4 key购买 nike

假设我有两个用外键约束连接的表。考虑以下代码:

using(var dc = TestDataContext())
{
IQueryable<ParentTable> query = dc.ParentTable;
query = query.Where(t => t.ChildTable.Where(c => c.Name.StartsWith("#")).Any());
Console.WriteLine(query.Count());
}

如果我需要扩展 Where在某些条件下,我会简单地链接 Where子句:

if(...)
query = query.Where(...);
...

事实上它会被添加到原来的Where通过 AND 条款sql语句。

现在想象一下,我需要动态构造 Where关于 ChildTable 的条款在 ParentTableWhere子句...

我试着这样做:

using(var dc = TestDataContext())
{
IQueryable<ParentTable> query = dc.ParentTable;

//here specify the necessary condition
Func<ChildTable, bool> where;
if(...)
where = c => c.Name.StartsWith("#");
else ...

query = query.Where(t => t.ChildTable.Any(where));
Console.WriteLine(query.Count());
}

但是它会抛出 NotSupportedException ,表示无法正确转换 where Func指定用于 Any进入 sql。

我想我可以指定 Expression<Func<ChildTable, bool>> ,但是t.ChildTableEntitySet<ChildTable>所以它没有实现 IQueryable<T> ...所以一个自定义 Func<>无法正确翻译成 sql。

除了每次都简单地重写整个语句之外,有没有办法实现这个目标:

1. query = query.Where(t => t.ChildTable.Where(c => c.Name.StartsWith("#")).Any());

2. query = query.Where(t => t.ChildTable.Where(c => c.Name.StartsWith("#") && ...).Any()));

...

最佳答案

在需要动态 where 子句的情况下,我喜欢使用 PredicateBuilder .

将该站点上的示例翻译成您的问题会给出以下代码。如果您使用的是 EF,则可能需要使用 .AsExpandable(),请参阅链接了解更多信息。

var predicate = PredicateBuilder.False<ParentTable>();
predicate = predicate.Or(p => p.ChildTable.Any(c => c.Name.StartsWith("#"));

var keywords = "search terms go here";
foreach (var keyword in keywords)
{
var temp = keyword;
predicate = predicate.Or(p => p.ChildTable.Any(c => c.Name.Contains(temp));
}

using(var dc = TestDataContext())
{
Console.WriteLine(dc.ParentTable.Where(predicate).Count());
}

关于c# - 如何为 EntitySet 构造 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23692012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com