2

好的,我有一个在创建 Linq to SQL 连接时生成的类。

它基本上看起来像这样:


    public partial class Product
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }

我通过添加另一个属性来扩展它,如下所示:


    public partial class Product
    {
        public string Category { get; set; }    
    }

现在我有一个 Linq 查询来获取产品详细信息,如下所示:


    public List GetProducts()
    {
        using(MyDataContext dc = new MyDataContext())
        {
            var products = from p in dc.Products
                           select p;
        }
    }

可以使用“p.Category.Description”在 Linq 查询中检索我添加的新字段(类别)。

所以我的问题是,这是填充 Product 类(包括新的 Category 属性)的最佳方式。

如果有一种方法可以通过使用 Linq 查询“select p”中的数据自动填充 Product 类的生成部分,我会更喜欢。

我还考虑在我的部分类上创建一个构造函数,该构造函数接受产品(选择 P)和类别(选择 p.Category.Description)

做这样的事情:


    // Linq query calling the constructor
    var products = from p in dc.Products
                   select new Product(p, p.Category.Description)

    // Product Constructor in my extended partial class
    public Product(Product p, string CategoryDescription)
    {
        this = p; // there must be a way to do something like this
        Category = CategoryDescription;
    }

但是有没有办法做到这一点,而不必列出 Product 类中的每个属性并单独设置它们?

4

3 回答 3

2

如果您想重用现有代码,则必须创建 Poco:

var products = from p in dc.Products
               select new Product
               {
                   Name = p.Name,
                   Description = p.Description,
                   Category = p.Category.Description
               }

或者为了更容易,只需执行以下操作:

public partial class Product
{
    public string Category
    {
        get { return this.Category.Description; }
        set { this.Category.Description = value; }
    }
}
于 2010-02-22T12:17:34.977 回答
1

LINQ-to-SQL 可以很好地发挥作用,只要您让它自己完成它的工作。IMO,处理这种情况的最佳方法是将 DBML 生成的类型保留在 DAL 中 - 仅在 100% 适合您想要返回的内容时才返回这些类型。

相反,我会创建一个不由LINQ-to-SQL 管理的新类型,然后返回它(您可以对非 DBML 类型进行基于初始化程序的投影);例如:

var products = from p in dc.Products // p is implicitly a Product
               select new ExtendedProduct  // our completely unrelated type
               {
                   Id = p.Id,
                   Name = p.Name,
                   //...
                   Category = p.Category.Description
               };

这应该允许您将数据取出,没有任何无声的 n+1 问题,也没有数据上下文的抱怨。这也意味着您可以完全控制查询哪些列以及如何映射它们。

本质上,这使用 LINQ-to-SQL只是为了进行数据库集成,使用我们自己的类型作为主应用程序。

于 2010-02-22T12:18:56.803 回答
0

看起来你想要做的是这样的:

using(MyDataContext dc = new MyDataContext())
{
    var products = from p in dc.Products
                   select p;
    foreach(Product p in products)
        p.Category = p.Category.Description;
}

...这对我来说没有任何意义。首先,必须将“类别”之一称为其他名称。

于 2010-02-22T12:32:58.860 回答