Сам SubSonic полностью написан на C #, но генерация кода для ваших таблиц и представлений также доступна для vb.net.
Для SubSonic3 вам необходимо добавить VB-шаблоны в ваш проект
http://github.com/subsonic/SubSonic-3.0-Templates/tree/master//SubSonic.TemplatesVB/
Для SubSonic2 вы должны добавить параметр /lang vb
в subcommander (sonic.exe)
Тем не менее, я бы лично остановился на генерации кода на C #, так как он более проверен из-за большей пользовательской базы, я полагаю.
Вы можете добавить еще один проект библиотеки классов c # в свое решение (в любом случае вы должны создать отдельный проект для вашего DAL) и связать его в своем проекте на сайте vb.net. Я тоже запускаю такой вид установки.
В этом сценарии есть 3 недостатка:
1) Вы не можете создавать решения со смешанными проектами на языках программирования с помощью Visual Studio Express Edition.
2) если вы не хотите расширять сгенерированные классы (с частичными классами, а не наследованием), вы должны сделать это в c #, так как частичные классы должны быть в одном проекте.
3) Если вы что-то измените в своем проекте на c #, ошибки времени разработки будут показаны только после следующей компиляции (например, если вы измените имя столбца, которое используется в вашем проекте vb, и заново создадите DAL, в окне ошибок будет показана только эта ошибка если вы компилируете свое решение / проект c # один раз.
В конце дня я бы посоветовал вам придерживаться c #, так как гораздо интереснее кодировать с помощью subsonic (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>();
}