Динамическое создание Linq - PullRequest
1 голос
/ 01 августа 2011

Я переписываю запрос, который создается в ответ на ввод пользователя в текстовые поля, чтобы обеспечить некоторую защиту от атаки SQL-инъекцией.

SELECT DISTINCT (FileNameID) FROM SurNames WHERE Surname IN
('Jones','Smith','Armitage') 
AND FileNameID IN ( SELECT DISTINCT (FileNameID) FROM FirstNames WHERE FirstName 
IN ('John','William') )

Может быть задействовано до 3 других таблицв этом процессе.В списках параметров может быть до 50-100 записей, поэтому создание параметризованного запроса утомительно и громоздко.

Я пытаюсь создать запрос Linq, который должен позаботиться о параметризации и обеспечить необходимую мне защиту.

Это дает мне то, что мне нужно

  var surnameValues = new[] { "Jones","Smith","Armitage" };
  var firstnameValues = new[] { "John","William" };

  var result = (from sn in db.Surnames
                from fn in db.FirstNames
                where surnameValues.Contains(sn.Surname) &&
                firstnameValues.Contains(fn.FirstName)
                select fn.FileNameID).Distinct().ToArray(); 

Теперь мне нужен способ динамического создания этого в зависимости от того, выбрал ли пользователь / ввел значения в поля ввода текста фамилии или имени?

Любые указатели будут с благодарностью получены

Спасибо, Роджер

1 Ответ

1 голос
/ 02 августа 2011

вы можете объединить всю логику в запросе;

var surnameValues = new[] { "Jones","Smith","Armitage" };
var firstnameValues = null;

// Set these two variables to handle null values and use an empty array instead
var surnameCheck= surnameValues ?? new string[0];
var firstnameCheck= firstnameValus ?? new string[0];

var result = (from sn in db.Surnames
            from fn in db.FirstNames
            where
            (!surnameCheck.Any() || surnameCheck.Contains(sn.Surname)) &&
            (!firstnameCheck.Any() || firstnameCheck.Contains(fn.FirstName))
            select fn.FileNameID).Distinct().ToArray(); 

В вашем запросе нет условия соединения между таблицей фамилий и таблицей firstNames?

Можнодинамически создать запрос (как вы, кажется, делаете, я использовал перекрестное соединение SelectMany)

var query=db.Surnames.SelectMany(sn=>db.FirstNames.Select (fn => new {fn=fn,sn=sn}));
if (surnameValues!=null && surnameValues.Any()) query=query.Where(x=>surnameValues.Contains(x.sn.Surname));
if (firstnameValues !=null && firstnameValues.Any()) query=query.Where(x=>firstnameValues.Contains(x.fn.FirstName));
var result=query.Select(x=>x.fn.FileNameID).Distinct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...