我得到了以下LINQ表达式:
Context.TableOne.Select(
one =>
new
{
one.Column1,
one.Column2,
one.Column3,
one.Column4,
one.Column5,
one.Column6,
one.Column7,
one.Column8,
one.Column9,
TwoCount = one.TableTwo.Count()
});
当我选择它时:
Context.TableOne.Select(
one =>
new
{
One = one,
TwoCount = one.TableTwo.Count()
});
我会得到一个嵌套属性“One”,其中包含“one”的所有字段。这需要我(例如在数据网格中)指定FieldNames One.Column1
或One.Column2
而不是Column1
或Column2
是否可以包含TwoCount = one.TableTwo.Count()
- 语句而无需指定此表达式中的每一列?
答案 0 :(得分:1)
您可以选择整个实体:
Context.TableOne.Select(one => new {
One = one,
TwoCount = one.TableTwo.Count()
});
答案 1 :(得分:0)
是的,虽然我很困惑为什么你认为你需要首先选择所有的列。
答案 2 :(得分:0)
选择整个对象,而不是每个属性。
Context.TableOne.Select(
one =>
new
{
One = one,
TwoCount = one.TableTwo.Count()
});
答案 3 :(得分:0)
当您使用new {....}
时,您正在创建一个新的匿名类型。然后,您将使用对象初始值设定项语法在该类型上设置属性。如果我们将其分解为实际发生的情况,可能会更容易理解。
首先,您要创建一个新类型Foo
。让我们将其简化为3个属性
public class Foo
{
public object Column1 { get; set; }
public object Column2 { get; set; }
public int TwoCount { get; set; }
}
现在,让我们看一下你选择的lambda表达式。我们可以将其提取为如下函数。
public Foo CreateFoo(TableOne one)
{
Foo foo = new Foo();
foo.Column1 = one.Column1;
foo.Column2 = one.Column2;
foo.TwoCount = one.TableTwo.Count();
return foo;
}
如您所见,我们必须设置每个属性。我们可以将此逻辑封装在构造函数或类Foo
中的其他位置,因为它不是匿名类型。但是,使用匿名类型时,您无法做到。
答案 4 :(得分:0)
对于每个使用EntityFramework的人,我都有适合您的解决方案:
在TableOne
命名空间中创建一个部分类,并在那里添加一个新属性:
public partial class TableOne
{
public int TwoCount { get { return Two.Count; } }
}
这样你就可以选择整个实体:
var result = Context.TableOne;