0
  1. Web 服务不能返回匿名类型。
  2. 如果您正在通过数据上下文使用类构建 LINQ 查询......您无法在查询中构造这些类的实例。

我为什么要这样做?假设我想加入三个“表”或对象集。我有三个相互具有外键的项目。并且说最低,最详细的这些是由一个类表示的,该类具有来自其他两个字段的字段来表示这些数据。在我的 LINQ 查询中,我想返回一个最低、最详细的类的列表。这是我决定“将一些表连接在一起”并通过 LINQ 将每个表中的数据通过 WebService 返回到 SQL 的一种方式。这可能是不好的做法。我当然不喜欢将附加属性添加到最低级别的类中。

考虑这样的事情......(请忽略命名约定,它们是由内部考虑驱动的)也出于某种原因我需要为连接实例化一个匿名类型......我不知道为什么会这样......如果我不这样做我得到一个错误......

from su in _dataContext.GetTable<StateUpdate>()
                  join sfs in _dataContext.GetTable<SystemFacetState>()
                    on new { su.lngSystemFacetState } equals new { lngSystemFacetState = sfs.lngSystemFacetState }
                  join sf in _dataContext.GetTable<SystemFacet>()
                    on new { sfs.lngSystemFacet } equals new { lngSystemFacet = sf.lngSystemFacet }
                   join s in _dataContext.GetTable<System>()
                    on new { sf.lngSystem } equals new {lngSystem = s.lngSystem}
                  select new
                  {
                      lngStateUpdate = su.lngStateUpdate,
                      strSystemFacet = sf.strSystemFacet,
                      strSystemFacetState = sfs.strSystemFacetState,
                      dtmStateUpdate = su.dtmStateUpdate,
                      dtmEndTime = su.dtmEndTime,
                      lngDuration = su.lngDuration,
                      strSystem = s.strSystem
                  }
                  ).ToList();

请注意,我必须构建由每种类型的片段组成的匿名类型。然后我必须做这样的事情......(将其转换为已知类型以通过 Web 服务传输)

result = new List<StateUpdate>(from a in qr select(new StateUpdate 
{
    lngStateUpdate = a.lngStateUpdate,
    strSystemFacet = a.strSystemFacet,
    strSystemFacetState = a.strSystemFacetState,
    dtmStateUpdate = a.dtmStateUpdate,
    dtmEndTime = a.dtmEndTime,
    lngDuration = a.lngDuration,
    strSystem = a.strSystem
}));

这太可怕了。也许我已经造成了一个可怕的混乱。如果我在这里偏离轨道,请引导我走向光明。当我将所有这些“未映射”属性添加到 StateUpdate 类时,我觉得我在这里遗漏了一些基本的东西。

我希望有人能看到我在这里做什么,这样我就能找到更好的方法。

4

2 回答 2

1

您可以创建一个“dto”类,它只包含您需要返回并填充它的属性,而不是匿名对象:

public class Result
{
    public string lngStateUpdate
    {
        get;
        set;
    }

    ... // other properties
}

然后像这样使用它:

from su in _dataContext.GetTable<StateUpdate>()
...
select new Result
{
    lngStateUpdate = su.lngStateUpdate,
    ... // other properties
}

Nitpick 注意 - 请放弃匈牙利符号和骆驼外壳的属性:)

于 2013-07-24T13:59:28.320 回答
0

我认为答案是创建另一个对象作为 DTO。此对象不会映射到数据上下文,并且可以包含跨映射对象的字段。这解决了映射对象中重复属性的问题,并允许在查询中实例化 DTO 类,因为它没有映射。

仅供参考:关于连接的问题 - 我重新审视了这个问题,我想我之前可能已经切换了连接的内部和外部组件。

于 2013-07-24T13:54:36.813 回答