在LINQ表达式中包括表计数

时间:2012-11-27 14:05:22

标签: c# linq count

我得到了以下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.Column1One.Column2而不是Column1Column2

是否可以包含TwoCount = one.TableTwo.Count() - 语句而无需指定此表达式中的每一列?

5 个答案:

答案 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;