ASP.NET GridView DataSource с LINQ и объединениями - PullRequest
1 голос
/ 18 мая 2011

Я пытаюсь использовать LINQ для привязки данных в моем GridView.

В моем файле Service.cs у меня есть метод для извлечения записей для определенного вошедшего в систему пользователя:

public List<tidsregistrering> ShowTidregistreringer()
{
    var CurrentMedarbejder = FindUser(HttpContext.Current.Session["email"].ToString());

    var tempList = (from t in kdc.tidsregistrerings
                    join p in kdc.projekts on t.projektid equals p.id
                    join k in kdc.kundes on t.kundeid equals k.id
                    join o in kdc.øvriges on t.øvrigeid equals o.id
                    where t.medarbejderid == CurrentMedarbejder.id
                    select t).ToList();    

    return tempList;
}

Где KDC мой DataContext . Я попытался соединить разные таблицы вместе, но в моем GridView данные не отображаются. Если я пропускаю объединения, я получаю данные ... В других моих таблицах у меня есть столбец с именем navn (имя). Я хочу, чтобы это имя печаталось в моем GridView вместо ссылки на внешний ключ ...

Мой GridView:

<asp:GridView ID="GridView1" runat="server">
    <Columns>
        <asp:BoundField DataField="tidsforbrug" HeaderText="Tidsforbrug" />
        <asp:BoundField DataField="dato" HeaderText="Dato" />
        <asp:BoundField DataField="<%# Bind("projekt.id") %>" HeaderText="Projekt" />
        <asp:BoundField DataField="<%# Bind("kunde.id") %>" HeaderText="Kunde" />
        <asp:BoundField DataField="<%# Bind("øvrige.id") %>" HeaderText="Øvrigt" />
        <asp:BoundField DataField="done" HeaderText="Done" />
    </Columns>
</asp:GridView

Моя привязка происходит при загрузке страницы:

GridView1.DataSource = service.ShowTidregistreringer();
GridView1.DataBind();

Как мне это сделать?

Edit: И для большей степени это мой список на данный момент ... И я хочу, чтобы эти числа в projektid, kundeid и øvrigeid были объединены с моими таблицами внешних ключей.

* Edit2: ** Для еще большей оценки, как создаются таблицы моей базы данных:

CREATE TABLE chef(
    id int identity primary key,
    email varchar(100) unique not null,
    password char(100) not null,
    navn varchar(100) not null
);

CREATE TABLE medarbejder(
    id int identity primary key,
    email varchar(100) unique not null,
    password char(100) not null,
    navn varchar(100) not null,
    chefid int foreign key references chef(id)
);

CREATE TABLE projekt(
    id int identity primary key,
    navn varchar(50) not null,
    beskrivelse varchar(255) not null
);

CREATE TABLE kunde(
    id int identity primary key,
    navn varchar(50) not null,
    beskrivelse varchar(255) not null
);

CREATE TABLE øvrige(
    id int identity primary key,
    navn varchar(50) not null,
);

CREATE TABLE tidsregistrering(
    id int identity primary key,
    tidsforbrug float,
    dato datetime,
    projektid int foreign key references projekt(id),
    kundeid int foreign key references kunde(id),
    øvrigeid int foreign key references øvrige(id),
    medarbejderid int foreign key references  medarbejder(id) not null,
    done bit
);

Edit3: Я переделал свой LINQ-запрос к этому:

List<tidsregistrering> tempList = (from t in kdc.tidsregistrerings
                                   join p in kdc.projekts on t.projektid equals p.id into p_t
                                   join k in kdc.kundes on t.kundeid equals k.id into k_t
                                   join o in kdc.øvriges on t.øvrigeid equals o.id into o_t
                                   from k in k_t.DefaultIfEmpty()
                                   from p in p_t.DefaultIfEmpty()
                                   from o in o_t.DefaultIfEmpty()
                                   where t.medarbejderid == CurrentMedarbejder.id
                                   select t).ToList();

Но он по-прежнему не выбирает, что присоединилось ...

http://i.stack.imgur.com/eSFQX.png

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Выполнить этот запрос в SQL Server Management studio

select t.* from tidsregistrerings t 
inner join projekts p on t.projektid = p.id
inner join kundes k on t.kundeid    = k.id 
inner join øvriges o on t.øvrigeid = o.id 
where t.medarbejderid = [whatever CurrentMedarbejder id is]

Затем комментируйте объединения по одному, пока не вернете свои результаты. Это покажет вам, какая таблица препятствует возвращению ваших данных.

1 голос
/ 18 мая 2011

Ну, должно быть что-то не так с вашими данными в базе данных. Или, скорее, из-за всех объединений вы не получаете никаких данных.

Обновление Из объяснения вашей db-структуры я вижу, что проблема состоит в том, что вы объединяете три таблицы с внутренними объединениями, а некоторые поля, к которым вы присоединяетесь, имеют нулевое значение. Таким образом, вы никогда не получите никаких результатов. Вам нужно перейти к внешним соединениям. У Linq нет оператора внешнего соединения, но это можно сделать. посмотрите здесь: http://smehrozalam.wordpress.com/2009/06/10/c-left-outer-joins-with-linq/

И, между прочим, если у вас есть подходящие внешние ключи в вашей базе данных, вы можете просто получить:

tempList = (from t in kdc.tidsregistrerings
where t.medarbejderid == CurrentMedarbejder.id 
select t).ToList();  

Обновление 2 И вы можете связать это так:

<asp:TemplateField HeaderText="navn" SortExpression="projekts.navn">
                        <ItemTemplate>
                            <asp:literal ID="Label2" runat="server" Text='<%# Eval("projekts.navn") %>'></asp:literal>
                        </ItemTemplate>
                    </asp:TemplateField>
...