Создание анонимного объекта в классе для запроса linq на языке C#

#c# #linq #entity-framework-core

Вопрос:

Мне нужно выполнить много запросов linq, и мне полезно запускать их в конструкторе.

У меня есть такой вопрос, как :

 var query = _cctDBContext.table1
                         .Select(b => new {
                             b.Id, 
                             b.SegmentId, 
                             b.Response1, 
                             b.ResponseDescription, 
                             b.ResponseGuidance})
                         .Where(b => b.SegmentId == SegmentId)
 

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

Подобный этому:

 public class SegmentData
{
    private readonly sqldbCLSegImportUKSATPTestContext _clDBContext;
    private readonly sqldbCCTUKSATPTestContext _cctDBContext;
    private readonly IList<Response> ResponseCCTtoAuditResponse;

    public SegmentData(
        sqldbCLSegImportUKSATPTestContext clDBContext, 
        sqldbCCTUKSATPTestContext cctDBContext)
    {
        _clDBContext = clDBContext;
        _cctDBContext = cctDBContext;

        // AUDIT RESPONSE PAGE 15
        ResponseCCTtoAuditResponse = _cctDBContext.Response
                                                  .Select(b => new { 
                                                      b.ResponseId, 
                                                      b.SegmentId, 
                                                      b.Response1, 
                                                      b.ResponseDescription, 
                                                      b.ResponseGuidance})
                                                  .Where(b => b.SegmentId == 5)
                                                  .ToList();
    }
}
 

Я попытался присвоить IList as имя класса Entity Framework для таблицы, и это не работает. Любая помощь была бы потрясающей

Комментарии:

1. почему вы вообще используете анонимные объекты? Если вам нужно передать информацию из одного места в другое, вы должны указать имена строк для этих вещей, чтобы другим было легче понять ваш код. Создайте класс, содержащий выбранную информацию, и создайте экземпляры этого класса для каждого элемента-.

2. Это не очень хороший метод для использования анонимных объектов? При передаче данных другим методам/страницам /местам вы можете создать класс для этого.

3. Хорошо, я понимаю, возможно, вы могли бы привести мне пример, так как классы уже созданы EF Core. Я возвращаю linq как ToList() — так что небольшая помощь была бы удивительной.

4. вместо того, чтобы писать new { b.ResponseId, b.SegmentId, b.Response1, b.ResponseDescription, b.ResponseGuidance} , просто создайте класс с этими свойствами, а затем напишите new MyClass { ResponseId = b.ResponseId, ... } .

5. Я пытаюсь выполнить свой linq в конструкторе. У меня есть каждая таблица как класс (так как EF core все равно их создает) . Я могу делать это с Var = весь день, но это не кажется лучшим способом. Мне нужно найти способ выполнения linq в конструкторе . Может ли кто-нибудь предоставить мне достойную ссылку или помочь в этом ? Это не обязательно должно быть анонимным.

Ответ №1:

Вы по какой-то причине концентрируетесь на том, чтобы этот запрос выполнялся в конструкторе. Это не имеет к этому никакого отношения.

Ваш запрос создает список анонимного класса, а затем пытается назначить его Списку именованного, заранее определенного класса, ответа. Это не сработает, так как они разные.

Вместо создания анонимного типа назовите тип в запросе:

 ResponseCCTtoAuditResponse = _cctDBContext.Response.
          Select(b => new Response(){ ResponseId = b.ResponseId, 
                                      SegmentId = b.SegmentId,
                                      Response1 = b.Response1,
                                      ResponseDescription = b.ResponseDescription, 
                                      ResponseGuidance = b.ResponseGuidance}
                 ).Where(b => b.SegmentId == 5).ToList();
 

Это предполагает, что выбранный вами класс имеет те же поля, что и класс ответа, о котором вы, кажется, говорите. Или используйте другую форму запроса:

 ResponseCCTtoAuditResponse = (from r in cctDBContext.Response
                              where r.SegmentId == 5
                              select r).ToList<Response>();
 

Комментарии:

1. это идеально, так что теперь я могу исключать запросы при срабатывании конструктора… Я точно вижу, как это работает сейчас и что я сделал не так…