2013-03-10 83 views
0

我在我的应用程序中有一个非常简单的存储库模式,但是现在我有一个异议,我需要返回Code First Model和一些额外的数据。见下文。实体框架何时创建自定义DTO?

public IEnumerable<User> GetUsersWithinLocation(DbGeography geography) 

我真想包括在返回的模式是用户实例,从地理的距离(以英里或其他)。

下面是我看到的选项:

选项1:我可以返回User对象名单,没有距离,重新计算第二次的前端,并避免塞满了我的数据模型,但似乎有点多余..并且,这可能在某些情况下是不可能的,我只是觉得这种方法是错误的。

选项2:另一种选择是创建一个新的DTO,该DTO由用户构成或继承,例如UserDistance对象。这会给我所需的一切,但是我会为此创建一个新的存储库吗?如果每种模型类型返回的数据有很多变化,我可以认为这在大型应用程序中保持不稳定。

选项3:实现某种动态的ExtraData ViewBag排序图层,我可以随意传递额外的数据以及DTO。这会在我的图层之间产生更紧密的耦合,因为名称必须是已知的。我也不太喜欢这种方法。

任何指导极大的赞赏。

+0

我会用'User'和距离创建'Model',类似于** Option 2 **,但不创建存储库,至少您需要存储此信息。如果只是在某个时刻使用它,那么你可以按照我刚才所说的去做。希望我的意见能帮助你做出决定祝你好运!!! – ecampver 2013-03-10 06:13:19

+0

查看下面的答案...我基本上使用3的灵活性,强类型2,而不需要创建额外的对象。让我知道如果你喜欢它(: – rodmjay 2013-03-10 07:09:00

+0

检查我的答案下面,我认为这就是你想要的:P – ecampver 2013-03-10 21:54:09

回答

1

这里是方法来摆脱双呼叫到Distance

public IDictionary<User, double?> GetUsersWithinByLocation(DbGeography geography) 
{ 
    return this.Query.Select(x => new KeyValuePair<User, double?>(x, x.Address.Location.Distance(geography))) 
        .OrderBy(kvp => kvp.Value) 
        .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
} 

你可以做其他的事情,我认为这是一个更好一点是改变你的返回类型,这样你就可以做一个简单/更快的LINQ查询,这里是代码:

public IEnumerable<KeyValuePair<User, double?>> GetUsersWithinByLocation(DbGeography geography) 
{ 
    return this.Query.Select(x => new KeyValuePair<User, double?>(x, x.Address.Location.Distance(geography))) 
        .OrderBy(kvp => kvp.Value); 
} 

这种方法可以使用,因为它与KeyValuePair<T1, T2>,或者您可以使用Tuple<T1, T2>

请注意,在这两种情况下我做了什么是“存储”首先Distance的计算,然后通过KeyValuePair<T1, T2>OrderBy子句中的Value属性访问它。

希望这有助于;)

0

这是怎么回事?这里有什么问题?

public IDictionary<User, double?> GetUsersWithinByLocation(DbGeography geography) 
{ 
    return this.Query.OrderBy(x=>x.Address.Location.Distance(geography)) 
      .ToDictionary(x => x, x => x.Address.Location.Distance(geography)); 
} 

主要的问题是,我们两次运行这个距离的功能,有没有解决的办法?

+0

嘿Rod你现在可以检查我的新答案,让我知道它是否有帮助 – ecampver 2013-03-11 04:45:58

0

我通常会问自己一个不同的问题:我可以使用数据传输域对象?很少有答案是肯定的。为什么会这样?有很多情况下,UI通过域模型切片,并希望获得一块这样的一块。有(几乎)总是包含一个视图模型。大多数情况下,视图模型都经过验证。

所以对我来说:选项2。但是存储库不应该提供视图模型。它应该是位于存储库和视图之间的一个服务层(控制器,如果你在mvc中)并且编排库调用来收集视图模型的数据。这些存储库在内部公开了IQueryable,这些服务组成对这些IQueryables的查询并公开IEnumerable

+0

我想我会同意除此之外,我的视图模型往往有很多UI逻辑(UIHintAttribute),例如将ViewModels移动到服务层,因此ServiceLayer接口将导致大部分UI行为与应用程序中最抽象的地方耦合。我认为你本质上是建议一种DataViewModel,它表示可以在服务层中组成的数据表的逻辑切片。那么你有DTO - > DataViewModel - > ViewModel ...只是太重了。 – rodmjay 2013-03-11 08:17:03