我想在Linq语句中动态生成跨多个表跨多个表的谓词.在下面的代码片段中,我想使用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;
}
Run Code Online (Sandbox Code Playgroud)
有类似的东西:
void …Run Code Online (Sandbox Code Playgroud) 在使用实体框架时,我已阅读了与在Linq to Entities(.NET 3.5)中实现等效的LEFT OUTER JOIN相关的所有帖子,但尚未找到解决以下问题的方法.
给出两个表,由下面的对象表示:
public class Foo
{
public int FooId; // primary key
public string Name;
}
public class Bar
{
public int BarId; // primary key
public int FooId; // foreign key
public string Desc;
}
Run Code Online (Sandbox Code Playgroud)
我需要创建一个Linq to Entities语句,它是以下SQL语句的EQUIVALENT.请注意,WHERE语句包含两个OR'd条件,这两个条件跨越两个表,并使用DISTINCT限定符.
SELECT DISTINCT
Foo.*
FROM
Foo
LEFT OUTER JOIN Bar ON Foo.FooId = Bar.FooId
WHERE
(Foo.Name = 'fooname' OR Bar.Desc = 'bardesc')
Run Code Online (Sandbox Code Playgroud)
我生成的Linq查询是通过实体框架实现的Linq到实体,并且(希望)生成一个要在服务器上执行的SQL语句.Linq to Entities不支持FirstOrDefault()扩展子句,因此LEFT OUTER JOIN的标准Linq语法将不起作用.
这是我的解决方案,但我无法做到以下任何一种情况:
1)生成一个结果集,其中包含由LEFT OUTER JOIN操作返回的一组Foo/Bar组合.
2)实现WHERE子句的等价物: WHERE (Foo.Name = 'fooname' OR …