Windows 窗体控件和 LINQ;我应该返回啥?

Posted

技术标签:

【中文标题】Windows 窗体控件和 LINQ;我应该返回啥?【英文标题】:Windows Form Controls and LINQ; What should I return?Windows 窗体控件和 LINQ;我应该返回什么? 【发布时间】:2010-11-20 23:54:09 【问题描述】:

在使用 Windows 窗体控件和 LINQ 时,您的业务层如何返回数据是否有“最佳选择”?

现在我正在返回 DataTables,以便我可以将 DataSource 设置为返回的 DataTable。有更好的选择吗?为什么?

public class BLLMatrix

    public static DataTable GetMaintItems(int iCat)
    
        IQueryable<tblCaseNotesMaintItem> tItems = DALMatrix.GetCNTable();
        return
            (tItems.Where(item => item.CategoryID == iCat & item.IsActive).OrderBy(item => item.OrderID).Select(
                item => new  item.ItemID, item.ItemDescription )).CopyLinqToDataTable();
    

internal static class DALMatrix

    internal static MatrixDataContext MatrixDataContext = new MatrixDataContext();

    internal static Table<tblCaseNotesMaintItem> GetCNTable()
    
        return MatrixDataContext.GetTable<tblCaseNotesMaintItem>();
    

我发现了这个类似的问题 --> Separating concerns with Linq To SQL and DTO's

【问题讨论】:

【参考方案1】:

就个人而言,我更喜欢数据传输对象,但数据集在紧要关头工作。

基本上,这个想法是,如果您正在使用数据传输对象(没有逻辑,并且代表您希望在客户端上使用的模型),那么无论更改如何,它都是可以继续存在的抽象在前端或后端。这通常是个好主意。

DataSet 很有用,但由于基于数字/字符串的字段访问,它们缺乏编译时安全性(但在强类型 DataSet 的情况下并非如此)可能会造成问题。

通常,与数据传输对象相比,通过线路序列化数据集也会产生大量开销。

【讨论】:

当您说包含 DataTables 的 DataSet 时,对吗?另外,您有 DTO 的好例子吗?我会谷歌,但如果你有一个好的,我更喜欢推荐...... @Refracted Paladin:***在这里有一个很好的数据传输对象条目:en.wikipedia.org/wiki/Data_transfer_object,并且在 2009 年 8 月的 MSDN 标题“数据传输对象的优点和缺点”中有一篇很好的文章,位于:msdn.microsoft.com/en-us/magazine/ee236638.aspx【参考方案2】:

由于数据集的开销,我喜欢创建自己的模型类。如果您返回一个对象数组(或任何实现 IList 接口的对象),您仍然可以将其设置为等于大多数 ASP.NET 元素的 DataSource 属性。

【讨论】:

“大多数 ASP.NET 元素。” .... WinForm 控件也是如此吗??? WinForm 元素也应该能够使用 IList 对象。 谢谢,我会调查的。【参考方案3】:

我个人喜欢在使用指向List&lt;YourObject&gt; 的链接时设置我的数据源

【讨论】:

【参考方案4】:

我更喜欢业务逻辑返回对象的实例,例如 Car、ICar 或 List(Car) 让 DAL 为您填充对象。这样您就可以在数据和 UI 之间保持清晰的分离。

【讨论】:

【参考方案5】:

我喜欢使用 DataReader 而不是数据集,我将使用数据层中的迭代器块将 datareader 变成 IEnumerable&lt;IDataRecord&gt;。从那里开始,我在业务层和数据层之间有一个额外的步骤,将 IEnumerable 转换为IEnumerable&lt;MyBusinessObject&gt;。您也应该能够将其传递给表示层以进行数据绑定。

我喜欢这种方法,因为它在分离数据层和业务层方面做得更好:业务层不应该从数据集的角度思考,数据层也不应该知道如何构造业务对象。如果我认为这是一个单独的层级,我会得到两全其美的效果。对数据层或业务层的更改意味着我只需要更改构造我的业务对象的工厂代码。

【讨论】:

以上是关于Windows 窗体控件和 LINQ;我应该返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

c#winform窗体有啥控件,能够显示较长的全部字符串。

在具有一些控件的 Windows 窗体上绘制半透明覆盖图像

Windows 窗体和 C# 中的动态自上而下的控件列表?

WPF的控件没有句柄,但是有啥其他间接方法获得WPF控件的句柄啊。

WPF的控件没有句柄,但是有啥其他间接方法获得WPF控件的句柄啊。

改变控件在窗体中的上下位置应修改控件的啥属性 这些属性在编程里面会用到