1

我有两张表 1) 产品 2) 类别

Product 表有一个名为“CategoryID”的字段,Category 表有一个名为“CategoryName”、ID、DateCreated 和其他一些字段。

我想使用 LINQ to SQL 来查询所有产品行以及 Category.CategoryName。此查询将在数据源中使用并绑定到 ListView。

我知道我可以将 LoadWith 选项与 DataContext 和连接一起使用。但问题是我最终得到了 Product 和 Category 中的所有行。我真正想要的是 Product 中的所有行,只是Category.CategoryName

完美的解决方案是,如果 LoadWith 选项允许您指定要返回的字段,但正如在此处回答的那样,这是不可能的。

我确实找到了一种方法,创建一个自定义类,它具有我想要返回的完全相同的字段。所以例如

public class ProductInfo
{
   public string ProdName { get; set; }
   public int ProdID { get; set; }
   public int CategoryID { get; set; }
   public string CategoryName { get; set; } 
}

但问题是 select 语句最终很长。例如...

var products = from p in db.Products
               join c in db.Categories on p.CategoryID = c.ID
               select new ProductInfo { ProdName = p.ProdName, ProdID = p.ID,
 CategoryID = p.CategoryID, CategoryName = c.CategoryName }

这变得非常容易出错。

所以我的问题 - 有没有更好的方法来做到这一点?

编辑/澄清:我应该提到我需要中间类的原因是因为我需要能够将结果集作为特定类型返回,在本例中为 ProductInfo

4

3 回答 3

1

我认为您几乎走在正确的轨道上,但我不会真正担心中间课程:

var products = from p in db.Products
           join c in db.Categories on p.CategoryID = c.ID
           select new { p.ProdName, ProdId = p.ID, p.CategoryID, 
              CategoryName = c.CategoryName }

然后,您可以将其连接到 LinqDataSource 的 Selecting 事件中。Scott Guthrie 在他的帖子“使用带有 asp:LinqDataSource”控件的自定义 Linq 表达式中的“使用选择事件执行自定义查询投影”一节中谈到了这一点。

于 2009-01-20T20:05:11.933 回答
0

哦,天哪,我应该提到我需要中间类的原因是因为我需要能够将结果集作为特定类型返回,在本例中为 ProductInfo

于 2009-01-20T20:46:59.273 回答
0
List<ProductInfo> products = (from p in db.Products
               join c in db.Categories on p.CategoryID = c.ID
               select new ProductInfo { ProdName = p.ProdName, ProdID = p.ID,
 CategoryID = p.CategoryID, CategoryName = c.CategoryName }).ToList<ProductInfo>();
于 2009-01-20T20:57:08.067 回答