Я почти уверен, что вы не можете сделать один скомпилированный запрос охватывающим несколько таблиц (если вы это имеете в виду); как бы знать где искать? EF поддерживает что-то вроде этого с наследованием (и несколькими таблицами), но даже с наследованием LINQ-to-SQL поддерживает только одиночную таблицу различаемое наследование.
Суть этого вопроса во многом идентична с этим с более раннего сегодняшнего дня. Сложный бит является первичным ключом, поскольку его трудно определить абстрактно. Остальное просто GetTable<T>
(по крайней мере, с LINQ-to-SQL).
В этом случае вам не нужен суперкласс - просто способ получить первичный ключ. К счастью, я напоминаю, что LINQ-to-SQL предлагает способ сделать это (без необходимости использовать атрибуты, что не является обязательным требованием LINQ-to-SQL); следующее не прекомпилируется (и не проверено), но должно быть довольно близко:
( обновление исправлено и протестировано)
Первое использование:
Foo foo = ctx.Get<Foo>(fooid);
Bar bar = ctx.Get<Bar>(barid);
код:
public static TItem Get<TItem, TKey>(
this DataContext ctx, TKey key)
where TItem : class
{
var table = ctx.GetTable<TItem>();
var primaryKey = ctx.Mapping.GetMetaType(typeof(TItem))
.DataMembers.Where(
member => member.IsPrimaryKey).Single().Member.Name;
var item = Expression.Parameter(typeof(TItem), "item");
var lambda = Expression.Lambda<Func<TItem, bool>>(
Expression.Equal(
Expression.PropertyOrField(item, primaryKey),
Expression.Constant(key, typeof(TKey))),
item);
return table.Single(lambda);
}
public static TItem Get<TItem>( // common case
this DataContext ctx, int key)
where TItem : class
{
return Get<TItem, int>(ctx, key);
}
public static TItem Get<TItem>( // common case
this DataContext ctx, string key)
where TItem : class
{
return Get<TItem, string>(ctx, key);
}
Я посмотрю, смогу ли я найти способ предварительно скомпилировать его ...