我对VB很满意并且有一个非常大的项目我需要做。我遇到了SubSonic,它看起来很棒。
我不清楚我是否可以在VB中使用它。我已经看过一些帖子,表明他们已经做了,但在网站上它专门显示了C#。
我可以在VB.NET中使用SubSonic吗?
答案 0 :(得分:4)
SubSonic本身完全是用C#编写的,但是你的表和视图的代码生成也适用于vb.net。
对于SubSonic3,您需要将VB模板添加到项目中
http://github.com/subsonic/SubSonic-3.0-Templates/tree/master//SubSonic.TemplatesVB/
对于SubSonic2,您必须向子命令员(sonic.exe)添加/lang vb
参数
但是,我个人会坚持使用C#代码生成,因为我认为它因为更大的用户群而受到更多测试。
您可以将另一个c#类库项目添加到您的解决方案中(您应该为DAL创建一个单独的项目)并将其链接到您的vb.net网站项目中。我也运行这种设置。
此方案有3个缺点:
1)您无法使用visual studio express版本创建具有混合编程语言项目的解决方案。
2)如果你不想扩展生成的类(使用部分类,而不是继承),你必须在c#中这样做,因为部分类必须在同一个项目中。
3)如果你改变了c#项目的内容,设计时错误只会在下一次编译后显示(例如,如果更改vb项目中使用的列名并重新生成DAL,则错误窗口仅显示此错误如果您编译解决方案/ c#项目一次。
在一天结束时,我会鼓励你坚持使用c#,因为使用亚音速(linq,lamdas,...)进行编码会更有趣。但如果你不想,你应该对vb。
一些例子,在c#
中更容易实现// in vb.net you have to add the _ modifier at the end of each line
// one thing that gets annoying for large linq queries or
// when using subsonics query tool
var query = from p in products.All()
join c in prodctcategories.All() on p.categoryId equals c.id
where c.categoryName == "Food"
select new {p.productName, c.categoryName}
// from the subsonic3 docs:
//find a single product by ID
var product = Product.SingleOrDefault(x => x.ProductID == 1);
//get a list of products based on some criteria
var products = Product.Find(x => x.ProductID <= 10);
// You can write lamdas in vb.net but they don't look as nice as in c#
Dim product = Product.SingleOrDefault(Function(x) x.ProductID = 1)
Dim products = Product.Find(Function(x) x.ProductID <= 10)
// If you have to write InlineQueries (subsonic's backdoor) you can do this
// with c#. For vb.net you would need a) internal backing fields for the
// poco class ProductResult and you would again need the concat
// the query string with underscore, Environment.NewLine and &
public class ProductResult
{
public int ProductId {get;set;}
public string ProductName {get;set;}
}
public List<ProductResult> GetProducts()
{
string query = @"SELECT p.productid, p.name as productname
FROM product p
INNER JOIN productcategories pc
WHERE pc.categoryname = 'Food'
ORDER BY p.productid ASC";
var result = new CodingHorror(query).ExecuteTypedList<ProductResult>();
}