#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.