【问题标题】:Linq to SQL: Populating an extended generated class in a Linq QueryLinq to SQL:在 Linq 查询中填充扩展生成的类
【发布时间】:2010-02-22 20:32:58
【问题描述】:

好的,我有一个在创建 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 查询中检索我添加的新字段(Category)。

所以我的问题是,这是填充 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 类中的每个属性并单独设置它们??

【问题讨论】:

  • 我很困惑....认为类别是一个字符串?扩展属性在 c# 中是不可能的...
  • Category 是我扩展类中的一个字符串。但它是数据库上的一个表。我将使用 Category 表上的 Description 字段来填充我的扩展类上的 Category 属性:)

标签: c# linq-to-sql partial


【解决方案1】:

如果您想重用现有代码,则必须改为创建 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; }
    }
}

【讨论】:

  • @marc,是的,好点,虽然我的第一个选择已经提到了 Poco(为了避免这种情况)。只要在正确的上下文中使用该类就可以了。只是给 OP 另一个选择。
  • @Marc - 是的,我希望不必做你的第一个答案 - 这与使用构造函数并设置其中的所有属性相同。嗯,也许我想要做的事情是不可能的:(我可能只需要通过单独设置每个属性来填充对象。
  • @IrishJoker,我担心如果 Category 不是数据库中 Product 表的一部分,那么它将被延迟加载,除非您在查询中明确加载它,那么我的第二个选项就可以了.
【解决方案2】:

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 只是 进行数据库集成,使用我们自己的类型作为主应用程序。

【讨论】:

  • @Marc - 实际上这对存储过程很方便,我对使用它有两种想法,干杯:)
【解决方案3】:

看起来你正在尝试做的事情是这样的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多