Я использую крошку атрибутов сущности. Например:
// interface for "ID" attribute of Company entity
public interface ICompany_ID {
Guid CompanyID{get;set;}
}
// interface for "Name" attribute of Company entity
public interace ICompany_Name {
string Name{get;set;}
}
// interface for "Logo" attribute of Company entity
public interface ICompany_Logo {
byte[] Logo{get;set;}
}
// interface for all attributes of Company entity
public interface ICompany : ICompany_ID, ICompany_Name, ICompany_Logo { }
// base class for classes based on Company entity
public abstract class CompanyBase : ICompany_ID {
// implementation of ICompany_ID interface
}
// class for all attributes of Company entity
public class Company : ICompany {
// implementation of ICompany interface (all attributes)
}
// class for Company name lookup
public class CompanyNameLookup : CompanyBase, ICompany_Name {
// implementation of ICompany_Name interfade
}
Эта крошка позволяет мне работать с разными атрибутами разных сущностей, и все это безопасно для типов.
однако ваш уровень данных должен поддерживать этот сценарий.
Следующий способ - это динамическое создание классов поиска, но это гораздо сложнее. С другой стороны, он гораздо более гибкий.
EDIT:
Тогда выбор может быть например:
var companies = (from c in db.Table<ICompany>()
order by c.Name
select new CompanyNameLookup { ID = c.ID, Name = c.Name }
).ToList();
или для типов, созданных даным образом:
var companies = (from c in db.Table<ICompany>()
order by c.Name
select DynamicTypeFactory.New<ICompany_ID>( c.Id ).And<ICompany_Name>( c.Name ).Create()
).ToList();
DynamicTypeFactory
- это класс со статическим методом New
и свободным интерфейсом для классов создания данима во время выполнения.