Я пытаюсь написать некоторый общий linqtoSQL, который выполняет операции над объектами на основе их первичных ключей. Некоторые организации, с которыми я работаю, имеют составные первичные ключи.Использование первичных ключей в linqtoSQL
Фундаментально Я хочу, чтобы иметь возможность делать такие вещи, как:
if(PrimaryKey(foo) == PrimaryKey(bar)) ...
или,
from oldEntity in oldTableOrCollection
join newEntity in newTableOrCollection
on PrimaryKeyOf(oldEntity) equals PrimaryKeyOf(newEntity)
select new {oldEntity, newEntity}
только с требованием, чтобы субъекты имеют первичные ключи.
Вот что я нашел до сих пор:
Это можно делать такие вещи, как
var query = from row in oneTableOfRows
join otherRow in anotherTableOfRows on
new { row.Column1, row.Column2 }
equals
new { otherRow.Column1, otherRow.Column2}
select ...;
, в котором LinqToSql будет использовать анонимные типы для сравнения (при условии имена свойств совпадают).
я могу затем абстрактный метод для выбора столбцов, на которых можно объединить, чтобы общие типы строк:
void DoQuery<RowType,KeyType>(Table<RowType> oneTableOfRows,
Table<RowType> anotherTableOfRows,
Func<RowType, KeyType> keySelector)
{
var query = from row in oneTableOfRow
join otherRow in anotherTableOfRows on
keySelector(row)
equals
keySelector(otherRow)
select ...;
}
...
Func<rowType, keyType> myKeySelector = row => new { row.Column1, row.Column2 };
DoQuery(table, otherTable, myKeySelector);
То, что я пытаюсь перейти сейчас, когда keySelector будет выбрать первичный ключ любого RowType. Я использую настраиваемый шаблон на основе http://www.codeplex.com/l2st4, чтобы сгенерировать мои объекты (что само по себе довольно похоже на значение по умолчанию в VS). Я надеюсь идеально дать каждому созданному RowType возможность выбрать свой первичный ключ, собранный из dbml. До сих пор ouptut выглядит следующим образом:
public interface IPrimaryKeyEntity<PrimaryKeyType>
{
PrimaryKeyType PrimaryKey { get; }
}
//Here, Product is a table with composite primary key based on its ProductID and it's ProductPriceVersionID columns
//I've tried using both class and struct as the primary key type for entities
public class ProductPrimaryKey
{
public Guid ProductID;
public Guid ProductPriceVersionID;
}
public partial class Product : IPrimaryKeyEntity<ProductPrimaryKey>,
INotifyPropertyChanging, INotifyPropertyChanged
{
#region IPrimaryKeyEntity Implementation
public ProductPrimaryKey PrimaryKey
{
get
{ return new ProductPrimaryKey()
{
ProductID = this.ProductID,
ProductPriceVersionID = this.ProductPriceVersionID
};
}
}
#endregion
...
//Rest is mostly standard LinqToSql entity generation
}
Возвращаясь к первоначальной цели, теперь я могу скомпилировать следующий для всех моих первичных ключей сущностей:
from oldEntity in oldTableOrCollection
join newEntity in newTableOrCollection
on oldEntity.PrimaryKey equals newEntity.PrimaryKey
select new {oldEntity, newEntity}
Однако, во время выполнения, я получаю infamous [PrimaryKey] "не имеет поддерживаемого перевода в SQL" исключение.
Я понимаю, что перевести SQL необходимо использовать Expression
«ю.ш., однако я довольно знаком с Linq.Expressions
и не имели никакого прогресса еще пытается применить его к моей ситуации ...
Если кто-то может улучшить на то, что у меня до сих пор, или есть лучший способ в целом я бы знать ....
Приветствия
Изучение 'Expression', сгенерированного для вашего (рабочего) запроса в отладчике, должно быть хорошим местом для начала. Он находится под «Non-Public members»> «queryExpression». Я тоже новичок в этом, но я скажу, найду ли я что-то :) –
@VladislavZorov: Спасибо за предложение! Я определенно посмотрю, поможет ли это, когда я вернусь в офис завтра. – EdF