#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. это идеально, так что теперь я могу исключать запросы при срабатывании конструктора… Я точно вижу, как это работает сейчас и что я сделал не так…