Rec*_*ipe 5 .net c# linq entity-framework
以下设置为真:
- A是父类
- A有一到多个B.
A有一个到多个C.
B有一到多个X.
C有一到多个X.
X有一个名为EndDate的属性:这是过滤条件
我想检索一个具有A,B,C和X(ABX和ACX)的集合我想过滤该集合,只返回具有的元素X.EndDate = Date.
我不希望X的元素没有通过这个标准.这可以在一个Select中完成吗?
我正在尝试以下代码:
var set = _context.Set<A>()
.Include("B.X")
.Include("C.X")
.Where(a => a.B.Any(b => b.X.Any(x => x.EndDate == date)) ||
a.C.Any(c => c.X.Any(x => x.EndDate == date)))
.ToList();
Run Code Online (Sandbox Code Playgroud)
但是,当B.X在过滤条件中时,它也将包括CX当B.X(X可以很多)中的一个符合条件时,它将返回所有B.X实体
我尽力举一个例子:
A B X X.EndDate
A1 B1 BX1 2015-01-01
A1 B1 BX2 2015-01-02
A1 B2 BX3 2015-01-09
A C X X.EndDate
A1 C1 CX1 2015-01-03
A1 C1 CX2 2015-01-03
A1 C2 CX3 2015-01-02
When date == 2015-01-02
Results are:
A1 B1 BX1
BX2
B2 BX3
C1 CX1
CX2
C2 CX3
Desired results are:
A1 B1 BX2
C2 CX2
Run Code Online (Sandbox Code Playgroud)
注意:我只能使用这种表示法而不是类似SQL的表示法.需要包含更多实体,这可以(显然)只能通过带引号的.Include("")来完成
您想要做的是过滤包含的表,但这不是实体框架现在支持的功能: http: //entityframework.codeplex.com/workitem/47。如果您正在处理简单的类,那么您可以在 select 语句中实例化新的 A,如下所示:
var set = _context.Set<A>()
.Include("B.X")
.Include("C.X")
.Where(a => a.B.Any(b => b.X.Any(x => x.EndDate == date)) ||
a.C.Any(c => c.X.Any(x => x.EndDate == date)))
.Select(a => new A()
{
B = a.B
.Where(b => b.X.Any(x => x.EndDate == DatePicker))
.Select(b => new B()
{
X = b.X.Where(x => x.EndDate == DatePicker)
}),
C = a.C
.Where(c => c.X.Any(x => x.EndDate == DatePicker))
.Select(c => new C()
{
X = c.X.Where(x => x.EndDate == DatePicker)
})
});
Run Code Online (Sandbox Code Playgroud)
如果您的类不是那么简单,即您有许多必须在 select 语句中映射的属性,或者您有复杂的业务验证规则,那么您最好的选择可能是继续您的查询并简单地删除 B,在使用结果集中您不希望出现 C 和 X。
| 归档时间: |
|
| 查看次数: |
4815 次 |
| 最近记录: |