2009-07-08 6 views
0

Я хотел бы использовать Linq to SQL в своем приложении для форм Windows.Извлечение родовых запросов Linq

Данные в локальной базе данных извлекаются из веб-службы или создаются локально.

Если объект был извлекается из веб-службы он имеет ExternalId настроить

Я часто нужно использовать код, как показано ниже, чтобы принести объекты, ихнего ExternalId:

var user = (from u in db.User 
      where u.ExternalId == userExternalId 
      select u).First(); 

var location = (from l in db.Location 
      where l.ExternalId == locationExternalId 
      select l).First(); 

Так что я, хотя о изменяя его к общей функции, как показано ниже:

internal TEntity FetchByExternalId<TEntity>(System.Data.Linq.Table<TEntity> table, 
               int externalId) 
where TEntity: IExternalStorable 
{ 
    return (from obj in table 
      where obj.ExternalId == externalId 
      select (TEntity)obj).First(); 
} 

к сожалению, такая функция не компилируется:

  1. Я не могу добавить IExternalStorable к классу сущностей, как код генерируется из базы данных (хотя я об использовании частичных классов, но это не похоже на работу)
  2. Это C# жалуется, что TEntity ISN» t ссылочный тип Я не уверен, как должен выглядеть общий «где» сдерживать.

Любые идеи о том, как использовать linq в общих функциях?

ответ

1

1: частичные классы действительно должны работать. вы проверили, что пространства имен одинаковы? какую ошибку вы получаете?

2: должно быть

where TEntity : class, IExternalStorable 

поскольку в противном случае это может быть, скажем, другой интерфейс, который не мог быть создан

+0

Re: 1. Это была проблема с пространством имен :) Спасибо. –

+0

Проблема решена. Спасибо! –

2

Рассмотрим используя структуру вместо прокатки свой собственный:

Location location = db.Locations 
    .First(loc => loc.ExternalId == locationExternalId); 
+0

Спасибо :) Я обновлю свой код –