2009-02-07 3 views
0

Если у меня есть что-то вроде:и объект LINQ инициализации

var query = from children in _data.Children 
    where children.ChildId == childId 
    select new CustomModel.MyChild 
    { 
     ChildId = children.ChildId, 
     Name = children.ChildName 
    }; 

return query.FirstOrDefault(); 

Где я хочу, чтобы полученный объект мой пользовательской модели.

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

Например,

var query = from children in _data.Children 
    where children.ChildId == childId 
    select CreateMyCustomChild([param ??]); 

return query.FirstOrDefault(); 

Это может быть невозможно, я не знаю, но что метод подписи будет, если это возможно?

Я думаю только повторное использование, когда несколько запросов linq содержат код инициализации повторяющегося объекта.

Благодаря

ответ

1

Это действительно зависит от того, какую версию LINQ вы используете. Если вы используете LINQ to SQL, я не думаю, что вы можете вызывать произвольные методы в запросе. Переводчик запрос не будет знать, что делать с вызовом метода

Если вы используете LINQ к объектам, вы абсолютно нормально, чтобы сделать это, как это:

var query = from children in _data.Children 
    where children.ChildId == childId 
    select CreateMyCustomChild(children) 

return query.FirstOrDefault(); 

// Elsewhere 

public CustomModel.MyChild CreateMyCustomChild(OtherChild child) 
{ 
    return new CustomModel.MyChild 
    { 
     ChildId = child.ChildId, 
     Name = child.ChildName 
    }; 
} 

(примечание стороны: Я бы назвал переменную диапазона в запросе «child», а не «children», поскольку в любой момент она представляет только одного ребенка.)

+0

- спасибо @ Джон. К сожалению, это linqtosql. Также обратите внимание на единственного ребенка. –

0

Если вы хотите, вы могли бы написать «выбрать 1» или в случае «CreateMyCustomChild (детей)», так как «дети» является содержащий всю свою информацию. В вашем случае вы не добавляете много информации в «children», так почему бы не «выбрать детей»?

Другими словами, просто попробуйте. Тип возвращаемого значения будет определять, на каком типе перечисляется LINQ.

0

Предположим, у вас был метод, который сделал для вас преобразование.

public static class Conversions 
{ 
    public static CustomModel.MyChild ToCustomModel(this DataModel.MyChild source) 
    { 
    return new CustomModel.MyChild() 
    { 
     ChildId = source.ChildId, 
     Name = source.ChildName 
    } 
    } 
} 

Вы можете использовать такой метод для преобразования одного элемента.

DataModel.MyChild myResult = getResult(); 
CustomModel.MyChild myConvertedResult = myResult.ToCustomModel() 

Такой способ также может быть использован при вызове метода Enumerable.Select.

IEnumerable<DataModel.MyChild> myQueriedResults = getResult(); 
IEnumerable<CustomModel.MyChild> myConvertedResults = 
    myQueryiedResults.Select(c => c.ToCustomModel()); 
0

Хотя вы можете делать с выражениями, я не думаю, что это стоит хлопот. Вместо этого я предлагаю вам определить метод расширения как:

IQueryable<CustomModel.MyChild> ToModel(this IQueryable<Child> childs) 
{ 
    return childs.Select(c=> 
     select new CustomModel.MyChild 
     { 
      ChildId = children.ChildId, 
      Name = children.ChildName 
     }  
    ); 
} 

Вы можете позвонить:

return _data.Children 
    .Where(c=>c.ChildId == childId) 
    .ToModel() 
    .FirstOrDefault(); 
Смежные вопросы