Реализация IEnumerable - PullRequest
       12

Реализация IEnumerable

4 голосов
/ 16 февраля 2009

Я использую LINQ и с трудом понимаю, как заставить новые классы "доменной модели" работать в LINQ при выполнении запросов к таблицам. Я использую Linq для SQL и C # в .NET 3.5.

Предположим, я хочу класс расширенного клиента:

public class ExtendedClient 
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string strVal { get; set; }
}

и в моем слое данных я хочу заполнить это из двух таблиц (dc - это мой DataContext):

public ExtendedClient getExtendedClient(int clientID)
{
    var c = dc.GetTable<tClient>();
    var cs = dc.GetTable<tClientSetting>();
    var q = from client in c
            join setting in cs
            on client.ClientID equals setting.ClientID
            where client.ClientID == clientID
            select new ExtendedClient { client, setting.strValue };
    return q;   
}

Я пытаюсь вернуть строку в таблице tClient плюс один дополнительный столбец в tClientSetting.

Раздражающие ошибки, которые я получаю: Невозможно инициализировать тип ExtendedClient с инициализатором коллекции, поскольку он не реализует System.Collections.IEnumerable. а также Не удается неявно преобразовать тип «System.Linq.IQueryable» в «ExtendedClient». Существует явное преобразование (вам не хватает приведения?)

Я понимаю, что это основная ошибка, но я не могу определить, как BEST реализовать IEnumerable, потому что не могу найти пример.

Должен ли я делать это каждый раз Я хочу специализированный объект? Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 16 февраля 2009
public ExtendedClient getExtendedClient(int clientID)
{
    var c = dc.GetTable<tClient>();
    var cs = dc.GetTable<tClientSetting>();
    var q = from client in c
            join setting in cs
            on client.ClientID equals setting.ClientID
            where client.ClientID == clientID
            select new ExtendedClient { ID = client.ClientID, Name = client.Name, strVal = setting.strValue };
    return q.Single();
}

Вам придется делать аналогичную вещь каждый раз, когда вам нужно вернуть специализированный объект . Если вам не нужно возвращать его, вам не нужно указывать тип, и вам не понадобится специальный класс. Вы можете использовать анонимные типы:

from client in c
join setting in cs
on client.ClientID equals setting.ClientID
where client.ClientID == clientID
select new { ID = client.ClientID, Name = client.Name, strVal = setting.strValue };
0 голосов
/ 16 февраля 2009

Почему вы используете для этого специальный тип?

Я думаю, что вы можете сделать client.Settings.strValue, если настроите отношение Клиент-Настройки для создания свойства Client.Settings (вместо Settings.Client). И, насколько я помню, такая конфигурация возможна в LINQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...