gpt4 book ai didi

linq - PredicateBuilder 可以生成跨多个表的谓词吗?

转载 作者:行者123 更新时间:2023-12-04 15:03:56 28 4
gpt4 key购买 nike

我想在 Linq 语句中的 Join 中动态生成跨越多个表的谓词。在以下代码片段中,我想使用 PredicateBuilder 或类似的构造来替换以下代码中的“where”语句:

代替:

public class Foo
{
public int FooId; // PK
public string Name;
}

public class Bar
{
public int BarId; // PK
public string Description;
public int FooId; // FK to Foo.PK
}

void Test()
{
IQueryable<Foo> fooQuery = null; // Stubbed out
IQueryable<Bar> barQuery = null; // Stubbed out

IQueryable<Foo> query =
from foo in fooQuery
join bar in barQuery on foo.FooId equals bar.FooId
where ((bar.Description == "barstring") || (foo.Name == "fooname"))
select foo;
}

像这样:
void Test(bool searchName, bool searchDescription)
{
IQueryable<Foo> fooQuery = null; // Stubbed out
IQueryable<Bar> barQuery = null; // Stubbed out

IQueryable<Foo> query =
from foo in fooQuery
join bar in barQuery on foo.FooId equals bar.FooId
select foo;

// OR THIS

var query =
from foo in fooQuery
join bar in barQuery on foo.FooId equals bar.FooId
select new {foo, bar};

var predicate = PredicateBuilder.False<Foo>();
if (searchName)
{
predicate = predicate.Or(foo => foo.Name == "fooname");
}
if (searchDescription)
{
// Cannot compile
predicate = predicate.Or(bar => bar.Description == "barstring");
}
// Cannot compile
query = query.Where(predicate);
}

解决这个问题的任何想法,想法,策略?

谢谢,

欧拉运算符

最佳答案

我认为您的问题出在 PredicateBuilder 的类型 T 上 - 如果对 Foo 采取行动,则谓词的一半,另一半在 Bar 上。

您可以将其替换为一个简单的手动构建的查询:

void Test()
{
IQueryable<Foo> fooQuery = null; // Stubbed out
IQueryable<Bar> barQuery = null; // Stubbed out

IQueryable<Foo> query =
from foo in fooQuery
join bar in barQuery on foo.FooId equals bar.FooId
select new {Foo = foo, Bar = bar};

if (searchName)
{
query = query.Where(fb => fb.Foo.Name == "fooname");
}
if (searchDescription)
{
query = query.Where(fb => fb.Bar.Description == "barstring");
}

// use query here
}

另一种方法是使用 PredicateBuilder 但使其在 Foo,Bar 对上工作 - 例如
class FooBar
{
public Foo Foo {get;set;}
public Bar Bar {get;set;}
}

void Test(bool searchName, bool searchDescription)
{
IQueryable<Foo> fooQuery = null; // Stubbed out
IQueryable<Bar> barQuery = null; // Stubbed out

var query =
from foo in fooQuery
join bar in barQuery on foo.FooId equals bar.FooId
select new FooBar
{
Foo = foo,
Bar = bar
};

var predicate = PredicateBuilder.False<FooBar>();
if (searchName)
{
predicate = predicate.Or(foobar => foobar.Foo.Name == "fooname");
}
if (searchDescription)
{
predicate = predicate.Or(foobar => foobar.Bar.Description == "barstring");
}
query = query.Where(predicate);

// use query here
}

关于linq - PredicateBuilder 可以生成跨多个表的谓词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5303269/

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