Можно ли установить псевдоним столбца перед выполнением выбора с Linq на SQL - PullRequest
1 голос
/ 03 мая 2020

Я новичок в c# и использую Linq To SQL в Linqpad для извлечения данных из базы данных. В моей базе данных у меня есть много столбцов, которые по старым причинам являются именами Col1, Col2, Col3 и т. Д. c.

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

Вместо того, чтобы писать:

Clients.Where(c => c.Col1443 == true)

Я хотел бы иметь возможность сделать что-то вроде следующего:

var HasRedEyes= "Col1443";
Clients.Where(c => c.HasRedEyes == true)

Обратите внимание, что мне нужно это перевести на SQL, так как мне нужно получить эти данные из базы данных, эти данные не локализованы.

1 Ответ

1 голос
/ 03 мая 2020

Вы действительно должны найти способ A. Переименовать столбцы и B. Уменьшить их количество (более 1000 с лишним). Прошло много времени с тех пор, как я использовал LINQ для SQL, но если все, что вам нужно, это запросить способности, можете ли вы вместо этого определить представление с псевдонимами столбцов?

Кроме того, одним из способов решения этой проблемы было бы определение именованных выражений, представляющих предопределенные фильтры. Например, если предположить, что класс назван Client:

Expression<Func<Client, bool>> hasRedEyes = c => c.Col1443; // == true is implicit
var query = Clients.Where(hasRedRyes).ToList();

Но обратите внимание, что они могут быть составлены только в том случае, если вы AND их через последовательные вызовы * к Where:

Expression<Func<Client, bool>> hasRedEyes = c => c.Col1443;
Expression<Func<Client, bool>> hasBrownHair = c => c.Col1567 == "brown";
var query = Clients.Where(hasRedEyes).Where(hasBrownHair).ToList();

Если вам нужен OR, вам нужно определить фильтр or'd как его собственное предопределенное выражение *, например:

Expression<Func<Client, bool>> hasRedEyesOrBrownHair = c => c.Col1443 || c.Col1567 == "brown";
var query = Clients.Where(hasRedEyesOrBrownHair).ToList();

(* Альтернативой последнему биту будет либо используйте инструмент, такой как LINQKit или , чтобы вручную использовать API * 1018. * С последним вам придется принять два отдельных условия, получить тело отдельных выражений лямбда-выражений, использовать посетитель выражения для замены параметр одного из них, чтобы соответствовать другому, вызовите Expression.Or и, наконец, Expression.Lambda, чтобы создать новый фильтр, который вы могли бы передать Where. Эта та же самая концепция может быть применена и к 'и к и', хотя все это получает немного хитро.)

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