LINQ2SQL + PLINQO:如何处理这样的简单情况?

Posted

技术标签:

【中文标题】LINQ2SQL + PLINQO:如何处理这样的简单情况?【英文标题】:LINQ2SQL + PLINQO: How does one handle a simple situation like this? 【发布时间】:2010-12-20 16:46:29 【问题描述】:

我是 PLINQO 的新手,我对 LINQ2SQL 相当陌生,我正在添加一个新的 DAL(称为 DAL2)与我们现有的旧 DAL 并行。我们的想法是开始对我们添加的每一个新事物使用 linq2sql,然后慢慢开始将旧的 DAL 使用转移到新的 DAL2。

众所周知,LINQ 非常适合简单的事情,但在更复杂的场景(many2many、分离的对象等)中,问题会立即出现,并且需要解决它。 PLINQO(与 CodeSmish 一起)来拯救它,并添加了所有必要的结构和工具以使其更可用。到目前为止,一切都很好。

现在我已经有了我的 DAL2(我正在使用管理器)。有用”。但我有一些疑问。

我了解返回由以下查询组成的对象:

select name,  Count(*) as Total from SomeTable 

…在大多数 DB 应用程序中并不是一个奇怪的场景。该查询是一个很好的匿名类型的简单示例。

现在,想象一下这样的表结构。

Tag (1) <—> (n) PatientTag (n) <—> (1) Patient

这个想法是要知道每个标签有多少病人。一个简单的内部连接将在标签和患者标签之间使用 SQL 解决这个问题。为此,我什至不需要访问 Patient 表。 (我只需要计数)。

毕竟,我想要的只是例如:

TAG1、33

TAG2、21

TAG3、6

等等……

假设我设法创建了一个 linq2sql 查询:

   var result1 = from pt in dc.PatientTag
                 join t in dc.Tag on pt.TagId equals t.TagId
                 select new  TagName = t.TagName ;


   var result2 = from q in result1
                 group q by q.TagName into gp
                 select new  TagName = gp.Key, Total = gp.Count() ;

(我是 LINQ 的新手,所以如果上述内容不好,请原谅我缺少“LINQissm”)

鉴于我不能返回那个“新”匿名类型(除非我选择 Object 和反射,这不是我的意图),我假设我必须创建一个“帮助器”类来包含这两个东西(名称和总数) .这个想法是,上面的代码应该位于数据层或业务层的某个位置,而 在 UI 的代码中。

现在真正的问题是:

如果上述情况属实,如果我想将该结果(或结果数组)返回到 UI(以便正确显示和处理),我应该在哪里创建该“帮助程序”?

1) 在 DAL2/Helper/TagNameTotal.cs 中(举个例子)

2) 在 BLayer/Helpers/TagNameTotals.cs 中?

3) 以上都不是? (或两者之一?)

如果上述情况正确,那我在想什么?

当有人想将查询结果传递给 UI 并对其进行修改时,这不是很正常吗?假设在上面的示例中,我想更改 UI 中的 TagName(也许这不是最好的示例,但它适用)。

对不起,但我仍然觉得整个 LINQ2SQL 在 web 项目或简单应用程序之外使用时有点粗糙。这些是我们一直在使用 ADO.NET(以及之前的记录集)所做的基本事情。

创建一个选择/加入/组/crazySQL,修改,提交更改。

PLINQO 很好,因为它以原始形式(多 2 多、分离、上下文重新生成、缓存等)消除了 LINQ2SQL 的麻烦,但它仍然是 LINQ,因此必须应用 LINQ 实践。

我错过了什么?

注意:不要将 PLinq 与 PLinqO 混淆。

【问题讨论】:

【参考方案1】:

我已经在codesmith community 回复了这篇文章,但是我正在考虑这个问题并遇到了这篇文章。你可以找到this post some help

基本上,您创建一个迷你类并使用 let 语句定义一个子集,然后在需要时延迟加载它....

【讨论】:

没问题,很高兴为 Plinqo 用户提供服务。我们周围似乎没有很多人!【参考方案2】:

在我看来,这听起来像是 PLinqO 产品的无耻插件。我希望这不是你的意图。我查看了 PlinqO,也许会得到它,除非你必须购买 CodeSmith 才能得到它。不用了。

我使用 L2S 构建了一个功能齐全的 3 层平台,我遇到并处理了与 M:M 关系、分离实体(尤其是更新)、上下文处理等相关的问题,而没有使用 PLinqO 和任何其他第 3 方工具。一旦您了解了 L2S 的工作原理,就可以做到这一点。我认为我们的解决方案非常优雅,性能也非常好。

对于阅读本文的人,如果您想在第三方工具上花钱,请投资 LinqPad 和 Linqer。您可以以不到 75 美元的价格购买这两种工具;他们太棒了。而且我与他们中的任何一个都没有关联。

兰迪

【讨论】:

虽然实用(或缺少)PLINQO 不是问题,但您还没有真正理解 CodeSmith 的价值。 Codesmith 是关于代码生成的。我建议你重新阅读它。 我非常了解 CodeSmith 的工作。但是,我不喜欢一开始就必须购买一件东西来获得我真正想要的东西。如果我们决定需要完整的代码生成,我们将使用 Reegenerator (reegenerator.com)。它便宜得多。 我无法评论再生器,但 PLINQO 和 CodeSmith 很棒,只是文档不多,视频已经过时。显然可以使用 CodeSmith 一次(试用),PLINQO,生成所有代码并且不再重新生成代码,但 CodeSmith 的美妙之处在于重新生成按钮,它将保留您的所有更改并从数据库中带来新的东西。 PLINQO 只使用了 LINQ 技术,没什么花哨的,但是都搞定了。 成本不高,真的。我知道我使用代码生成为我当前的项目节省了几天的时间。 PLINQO 作为一个免费的框架,对我了解 LINQ to SQL 的来龙去脉很有帮助。 CodeSmith 许可证大约是一个月工作发票的 5%。我在上一个项目中使用了 NHibernate,我很可能会再次使用它,但是很糟糕。 Codesmith 和 PLINQO 给我留下了深刻的印象。 @Sympatric Gred - 您是否也知道 PLINQO 的 M2M 支持实现完全有缺陷(他们自己承认)?几个月前,我在他们的 M2M 支持中遇到了一个错误,并向他们发送了一封支持电子邮件。他们承认他们的 M2M 支持“完全有缺陷”,不知道什么时候会修复。

以上是关于LINQ2SQL + PLINQO:如何处理这样的简单情况?的主要内容,如果未能解决你的问题,请参考以下文章

我如何处理 .FirstOrDefault 方法?

如何处理 UsernameNotFoundException 春季安全

如何处理需求循环?

Spring Boot 如何处理可抛出对象

如何处理以下数据

如何处理警卫中显示的模态