Доступ к внешним ключам через LINQ

#c# #sql #linq #asp.net-4.0

#c# #sql #linq #asp.net-4.0

Вопрос:

У меня есть настройка на SQL Server 2008. У меня есть три таблицы. В качестве первичного ключа используется строковый идентификатор. Вторая таблица содержит индексы в таблице атрибутов. Третий просто хранит внешние ключи в обеих таблицах — так что сами атрибуты не хранятся в первой таблице, а вместо этого на них ссылаются. По-видимому, это распространено при нормализации базы данных, хотя это все еще безумие, потому что я знаю, что, поскольку ключ является строкой, для получения преимущества в пространстве потребуется максимум 1 атрибут на 30 записей первой таблицы, не говоря уже о проблемах со временем и сложностью.

Как я могу написать запрос LINQ to SQL, чтобы возвращать только значения из первой таблицы, чтобы они содержали только определенные атрибуты, как определено в списке во второй таблице? Я попытался использовать Join или GroupJoin , но, по-видимому, SQL Server 2008 не может использовать кортеж в качестве возвращаемого значения.

Ответ №1:

«Я пытался использовать Join или GroupJoin, но, по-видимому, SQL Server 2008 не может использовать кортеж в качестве возвращаемого значения».

Вы можете использовать анонимные типы вместо кортежей, которые поддерживаются Linq2SQL.

IE:

 from x in source group x by new {x.Field1, x.Field2}
  

Комментарии:

1. Это был правильный ответ. Мне кажется, что они должны быть идентичными, но это не так. Это работает абсолютно так, как я этого хотел! Спасибо.

Ответ №2:

Я не совсем понимаю, о чем вы просите. Может помочь некоторый код. Вы ищете что-то подобное?

 var q = from i in ctx.Items
        select new 
        {
            i.ItemId,
            i.ItemTitle,
            Attributes = from map in i.AttributeMaps
                         select map.Attribute
        };
  

Комментарии:

1. Это в значительной степени то, что мне было нужно, спасибо! Я должен был выбрать одного из вас и Катарина в качестве принятого ответа, и я выбрал его, потому что он явно назвал его анонимным типом, что позволило мне найти дополнительный справочный материал, который мне был нужен.

Ответ №3:

Я постоянно использую эту страницу для вычисления сложных запросов linq, когда я знаю подход sql, который я хочу использовать.

VB http://msdn.microsoft.com/en-us/vbasic/bb688085

C #http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

Если вы знаете, как написать sql-запрос для получения нужных вам данных, то это покажет вам, как получить тот же результат, переведя его в синтаксис linq.