小编Eul*_*tor的帖子

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

我想在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 join predicatebuilder

6
推荐指数
1
解决办法
4603
查看次数

通过实体框架和Where子句通过Linq To实体进行左外连接

在使用实体框架时,我已阅读了与在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 …

linq-to-entities entity-framework left-join outer-join

4
推荐指数
1
解决办法
8681
查看次数