Оператор SQL C # преобразован в LINQ, как я могу перевести этот оператор в рабочий linq - PullRequest
1 голос
/ 06 марта 2010

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

T-SQL ВЕРСИЯ:

SELECT P.[CID],P.[AID]
 ,B.[AID], B.[Data], B.[Status], B.[Language]
 FROM MY_TABLE_1 P
 JOIN 
  (
   SELECT A.[AID], A.[Data], A.[Status], A.[Language] FROM MY_TABLE_2 A  
   UNION ALL
   SELECT B.[AID], B.[Data], B.[Status], B.[Language] FROM MY_TABLE_3 B
  ) B on P.[AID] = B.[AID]
WHERE B.[Language] = 'EN' OR  B.[Language] = 'ANY' AND B.STATUS = 1 AND B.[Language] = 'EN' OR  B.[Language] = 'ANY' AND B.STATUS = 1

Затем я хотел бы создать набор результатов следующего

Results: | CID | AID | DATA |СТАТУС | ЯЗЫК

Ответы [ 3 ]

4 голосов
/ 06 марта 2010

Попробуйте это:

from p in Context.MyTable1
join b in Contact.MyTable2.Concat(Contact.MyTable3)
  on p.aid equals b.aid
where b.Language == "EN" || b.Language == "ANY"
where b.Status == 1
select new
{
    p.CID,
    p.AID,
    b.Data,
    b.Status,
    b.Language
};
2 голосов
/ 06 марта 2010

Не делай так.

Ваши два варианта

  1. Создание представления, которое представляет ваш оператор Union (Таблица2 и Таблица3)
  2. Создайте связь в DBML между таблицей 1 и новым представлением столбца AID.
  3. Сделайте SelectMany, чтобы получить требуемый результат возврата.

или (и предпочтительно)

  • Создать хранимую процедуру, которая принимает язык / статус (при условии, что они являются параметрами) и возвращает этот набор данных. Это будет самый эффективный метод.

Вы выполняете работу с базой данных в своей бизнес-логике! Используйте базу данных для того, для чего она предназначена.

1 голос
/ 08 марта 2010

Убедитесь, что вы ссылаетесь на System.Data.DataSetExtensions и используете метод AsEnumerable () для использования LINQ to DataSets.

            var myTable1 = new [] { 
            new { CID = "123", AID = 345, Data = 32323, Status = 1, Language = "EN"},
            new { CID = "231", AID = 123, Data = 11525, Status = 2, Language = "EN"},
            new { CID = "729", AID = 513, Data = 15121, Status = 1, Language = "ANY"},
            new { CID = "231", AID = 123, Data = 54421, Status = 2, Language = "EN"}}
            .ToDataTable().AsEnumerable();

        var myTable2 = new [] { 
            new { CID = "512", AID = 513, Data = 32323, Status = 1, Language = "ANY"},
            new { CID = "444", AID = 123, Data = 11525, Status = 2, Language = "BLAH"},
            new { CID = "222", AID = 333, Data = 15121, Status = 1, Language = "ANY"},
            new { CID = "111", AID = 345, Data = 54421, Status = 2, Language = "EN"}}
            .ToDataTable().AsEnumerable();

         var myTable3 = new [] { 
            new { CID = "888", AID = 123, Data = 32323, Status = 2, Language = "EN"},
            new { CID = "494", AID = 333, Data = 11525, Status = 1, Language = "FR"},
            new { CID = "202", AID = 513, Data = 15121, Status = 1, Language = "EN"},
            new { CID = "101", AID = 345, Data = 54421, Status = 2, Language = "ANY"}}
            .ToDataTable().AsEnumerable();

         var q = from p in myTable1
                 join b in myTable2.Union(myTable3) on p.Field<int>("AID") equals b.Field<int>("AID")
                 where (b.Field<string>("Language") == "EN" || b.Field<string>("Language") == "ANY") && b.Field<int>("Status") == 1
                 select new
                 {
                     CID = p.Field<string>("CID"),
                     B_AID = p.Field<int>("AID"),
                     P_AID = b.Field<int>("AID"),
                     Data = b.Field<int>("Data"),
                     Status = b.Field<int>("Status"),
                     Language = b.Field<string>("Language")
                 };


         var table = q.ToDataTable();

Я использовал метод расширения, который вы можете найти здесь , чтобы проверить это, это очень полезно, если вы делаете много LINQ поверх DataTables.

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