Как написать следующее в Linq или Sql - PullRequest
1 голос
/ 30 августа 2009

Цените, если я могу получить некоторую помощь в написании LINQ, который получит ВСЕ ПОЛЯ из таблицы A, и в тех полях, для которых профиль 1 имеет значение в таблице AB, покажите значение, в противном случае, если профиль 1 не имеет записи в таблице AB , затем показать значение как ноль.

Таблица A

AID    Field
-----------
1      OneField
2      TwoField
3      ThreeField

Таблица B

BID    Value
-----------
1      OneValue
2      TwoValue
3      ThreeValue

Таблица AB

ABID   AID   BID  ProfileId
-------------------------
1      1     1    1
2      2     3    1

Я пытаюсь написать Linq (или sql-запрос), который покажет мне для идентификатора профиля 1, все значения из таблицы a и для применимых значение из таблицы b.

, например

ProfileID  AID       Field        BID       Value
--------------------------------------------------------
1          1         OneField     1         OneValue
1          2         TwoField     3         ThreeValue
1          3         ThreeField   NULL      NULL

Как видите, цель состоит в том, чтобы получить ВСЕ ПОЛЯ из таблицы A, а в тех полях, для которых профиль 1 имеет запись в таблице AB, показать значение из таблицы B, в противном случае, если профиль 1 не имеет записи в таблице AB , затем показать как ноль.

Если решение требует этого, я с удовольствием напишу это в sql и вызову через хранимую процедуру.

Спасибо

Ответы [ 6 ]

0 голосов
/ 30 августа 2009

Версия SQL выглядит следующим образом

select TableA.*, TableB.*
from TableA
    left outer join TableC on TableA.ID = Aid
    left outer join TableB on TableB.id = Bid
where
    TableC.ProfileID = 1
    or TableC.ProfileID is null

Внешнее объединение гарантирует, что вы получите результаты из TableA, даже если на другой стороне объединения нет соответствующих записей. В результате вы также должны разрешить нулевые значения в ProfileID.

0 голосов
/ 30 августа 2009

Я получил работающее решение LINQ с полным автономным тестом. Я не добавил никаких утверждений в конце, но переменная в конце «queryResult» будет содержать список с желаемым результатом. Я проверил это и убедился, что это работает. Вот код:

Изменить: В ответ на ваш комментарий Вот пример # 2

    public class tablea
    {
        public int AID { get; set; }
        public string Field { get; set; }
    }
    public class tableb
    {
        public int BID { get; set; }
        public string Value { get; set; }
    }
    public class tableab
    {
        public int ProfileID { get; set; }
        public int AID { get; set; }
        public string Field { get; set; }
        public int BID { get; set; }
        public string Value { get; set; }
    }

    public class result
    {
        public int? profileid { get; set; }
        public int? aid { get; set; }
        public string field { get; set; }
        public string bid { get; set; }
        public string value { get; set; }
    }

    [Test]
    public void TestQuery()
    {
        var tablea = new List<tablea>();
        var tableb = new List<tableb>();
        var tableab = new List<tableab>();

        tablea.Add(new tablea{AID = 1,Field = "OneField"});
        tablea.Add(new tablea{AID = 2,Field = "TwoField"});
        tablea.Add(new tablea{AID = 3,Field = "ThreeField"});

        tableb.Add(new tableb{BID = 1,Value = "OneValue"});
        tableb.Add(new tableb{BID = 2,Value = "TwoValue"});
        tableb.Add(new tableb{BID = 3,Value = "ThreeValue"});

        tableab.Add(new tableab{AID = 1,BID=1,ProfileID = 1});
        tableab.Add(new tableab{AID = 2,BID=3,ProfileID = 1});

        var profileId = 1;

        var q1 = (from a in tablea
                  let bid = (from ab in tableab where ab.ProfileID == profileId && ab.AID == a.AID select ab.BID).FirstOrDefault()
                  let value = (from ab in tableab where ab.ProfileID == profileId && ab.AID == a.AID && ab.BID == bid select ab.Value).FirstOrDefault()
                select new result
                            {
                                profileid = profileId,
                                aid = a.AID,
                                field = a.Field,
                                bid = (bid == 0 ? "null" : bid.ToString()),
                                value = value ?? "null"
                           }).ToList();

    }
0 голосов
/ 30 августа 2009

См. Пример ниже:

var result = from a  in a
             join ab in ab on a.aid equals ab.aid into tmp1
         join b  in b  on b.id  equals ab.bid into tmp2
         from c in tmp1.DefaultIfEmpty()  /* this is to get the null values */
         from d in tmp2.DefaultIfEmpty()
         select new 
        {
         c.ProfileID,
         a.AID,
         a.Field,   
                 c.bid,
         d.Value
        };
0 голосов
/ 30 августа 2009

[код] var result = от a в объединить ab в ab на a.aid равно ab.aid в tmp1 объединить b в b на b.id равно ab.bid в tmp2 из c в tmp1.DefaultIfEmpty () / * это чтобы получить нулевые значения * / из d в tmp2.DefaultIfEmpty () выберите новый { c.ProfileID, a.AID, a.Field,
c.bid, d.Value }; [/ Код]

0 голосов
/ 30 августа 2009

Поскольку вы хотите ВСЕ строки из таблицы A, вам нужно начать с таблицы A:

SELECT AB.ProfileID, A.AID, A.Field, B.BID, B.Value 
FROM A 
LEFT OUTER JOIN AB ON AB.AID = A.AID
LEFT OUTER JOIN B ON AB.BID = B.BID
WHERE (AB.ProfileID = 1 OR AB.ProfileID IS NULL)

Если вы начнете с таблицы AB в своем запросе, вы всегда получите только то, что находится в таблице AB - а строка № 3 не имеет записи в таблице AB.

Марк

0 голосов
/ 30 августа 2009

Это должно работать (не проверено):

SELECT ProfileID, A.AID, Field, B.BID, Value 
FROM AB 
LEFT OUTER JOIN A ON AB.AID = A.AID
LEFT OUTER JOIN B ON AB.BID = B.BID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...